我正在尝试做什么:将作为对象的数组值与数组中的其他对象进行比较。如果针中的某些对象属性(我正在与其他对象进行比较的对象)与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]);
}
}
}
?>
答案 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] 进行比较。