如何比较和取消设置数组中的对象与数组中的其他对象?

时间:2014-02-10 15:11:27

标签: php arrays

我正在尝试做什么:将作为对象的数组值与数组中的其他对象进行比较。如果针中的某些对象属性(我正在与其他对象进行比较的对象)与haystack中另一个对象中的相同属性匹配,则将针中的某些属性合并到haystack中的匹配对象并取消设置针。 / p>

一些伪代码:

<?php
$haystack = array($obj1, $obj2, $obj3);
if(!empty($haystack)){
    for($x=0;$x<count($haystack);$x++){
        if($haystack[$x]->prop1 == $haystack[$x+1]->prop1 && $haystack[$x]->prop2 == $haystack[$x+1]->prop2){
            $haystack[$x]->combined1 = $haystack[$x]->prop1.','.$haystack[$x+1]->prop1;
            unset($haystack[$x+1]);
        }
    }
}
?>

2 个答案:

答案 0 :(得分:1)

扩大评论范围:

您必须将unset($haystack[$x+1]);更改为unset($haystack[++$x]);
如果索引0和1相等,则当前循环取消设置$haystack[1],将$i的值保持为0,然后循环继续递增$i为1(在此为1) case),并执行与刚刚未设置的$haystack[1]的比较 实际上递增$i意味着,在循环结束时$i将是1,而不是0.这将再次递增,并且下一次,循环将比较索引2和3

for ($x = 0, $max = count($haystack);$x <$max;++$x)
{
    if ($haystack[$x] == $haystack[$x+1])
    {//only increment if you unset!
        unset($haystack[++$x]);
    }
}

这应该可以解决问题。如果你想比较给定数组中的所有元素,那么你必须嵌套两个循环:

for ($x = 0, $max = count($haystack);$x <$max;++$x, $max =count($haystack))
{//re-assign $max after inner loop completes, and reset keys
    for ($j = $x+1;$j<$max;++$j)
    {
        if ($haystack[$x] == $haystack[$j])
        {//No need to increment again
            unset($haystack[$j]);
        }
    }
    $haystack = array_values($haystack);//this resets the keys
}

这应该可以解决你的问题

答案 1 :(得分:0)

<强>解决方案

        for($x=0;$x<count($haystack);$x++){
            for($y=0;$y<=count($haystack);$y++){
                if($haystack[$x]->prop1 == $haystack[$y]->prop1 && $haystack[$x]->prop2 == $haystack[$y]->prop2){
                    if($haystack[$x]->prop3 == $haystack[$y]->prop3){
                        continue;
                    }else{
                        $haystack[$x]->prop1 .= $haystack[$y]->prop1;
                        unset($haystack[$y]);
                    }
                }
            }
        }

回想起来,这是一个相当容易解决的问题。问题是试图在心理上保持迭代器的直接性并知道需要多少。为了在不复制数组或使用中间件的情况下工作,您只需要实例化两个迭代器以同时迭代数组,这样就可以将 $ array [0-n] 进行比较$ array [0-n] ,而不是将 $ array [0-n] $ arrayCopy [0-n] 进行比较。

相关问题