2015-08-27 132 views
0

我使用的是基本for循环与增量迭代器来检查重复:

$array = ['a', 'b', 'c', 'c', 'c', 'd']; 

for ($i = 0; $i < $length-1; $i++) { 
    if ($array[$i] == $array[$i + 1]) { 
    //delete $array[$i + 1] 
    $i--; 
    } 
} 

我想所有元素与数组中的下一个比较。如果有重复,我有一个辅助函数可以将其删除,但是想要将$i重新设置为1,将其与使用$i--;删除的元素之后的下一个元素进行比较。但是,当我这样做时,我陷入了无限循环。有谁知道如何解决这个问题?

+1

如果'$ i'是0,你加1 ++' '然后减去1'--','$ i'是什么? – AbraCadaver

+1

由于'for'增加了1,而你的'$ i - ;'减少了1,所以它被卡住了。所以它永远不会增加。它为**每个**迭代执行此操作,而不仅仅是数组匹配的位置。 – Qirel

+0

对不起!我的意思是它在'for'循环中 - 现在会更新。 – chloealee

回答

2

您在递增之后递减$i,因此它总是在01之间切换。

没有为你正在尝试做的PHP函数:array_unique()


$array = ['a', 'b', 'c', 'c', 'c', 'd']; 

$last = $array[0]; 
for ($i = 1; $i < count($array); $i++) { 
    if ($array[$i]==$last) { 
    unset($array[$i]); // delete element 
    } 
    else $last = $array[$i]; // remember value 
} 

var_dump($array); 

产生

array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [5]=> string(1) "d" } 
+0

感谢您快速回复我!我不想使用array_unique(),因为我需要实际删除用户(使用助手函数)。有没有办法将计数器设置回一个,然后当它增加时,它将与删除前相同的记录上?所以,如果我[1],比较[1]和[2],然后删除[2]。然后我想比较[1]至[3]。 – chloealee

+0

你必须嵌套两个“for”语句。将$ array [$ i]存储到一个var中,使用另一个'for'来通过另一个计数器来遍历相同的数组索引,例如。 $ j,并且比较每个循环($ var == $ array [$ j]?delete($ array [$ j])) –

+0

更容易的是存储您看到的最后一个值,并且不会被删除并与迭代时的值进行比较进一步。所以你把它放在'$ last'中的第一个值,用第二个值('$ i = 1')开始循环,每个没有被删除的值都应该覆盖'$ last'('$ last = $阵列[$ i]于')。我尝试在答案中加入类似这样的内容 – syck