【问题标题】:$i--; iterator gets caught in infinite loop - for loop php$i--;迭代器陷入无限循环 - for loop php
【发布时间】:2015-08-27 16:01:58
【问题描述】:

我正在使用带有递增迭代器的基本 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 重置回一个,以再次将其与使用$i--; 删除的元素之后的下一个元素进行比较。但是,当我这样做时,我陷入了无限循环。有谁知道如何解决这个问题?

【问题讨论】:

  • 如果$i为0,你加1++再减1--,那么$i是什么?
  • 它被卡住了,因为for 增加了 1,而你的 $i--; 减少了 1。所以它实际上永远不会增加。它对每一次 迭代执行此操作,而不仅仅是数组匹配的位置。
  • 对不起!我的意思是它在 for 循环中 - 现在会更新。

标签: php for-loop infinite-loop


【解决方案1】:

您在增加$i 后减少它,所以它总是会在0 和1 之间切换。

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" } 

【讨论】:

  • 感谢您这么快回复我!我不想使用 array_unique() 因为我需要实际删除用户(使用辅助函数)。无论如何将计数器设置回一,这样当它增加时,它将与删除前的记录相同?所以,如果我在 [1] 上,比较 ​​[1] 和 [2],然后我删除 [2]。然后我想比较 [1] 和 [3]。
  • 您必须为此嵌套两个 for 语句。将 $array[$i] 存储到一个 var 中,使用另一个 for 通过另一个计数器遍历相同的数组计数索引,例如。 $j,并比较每个循环 ($var == $array[$j]?delete($array[$j]))
  • 更简单的方法是存储您看到但未删除的最后一个值,并在进一步迭代时与该值进行比较。所以你把它放在$last中的第一个值,用第二个值($i=1)开始循环,每个没有被删除的值都应该覆盖$last($last = $array[$i])。我尝试在答案中添加类似的内容,
  • syck - 非常感谢您的帮助!不幸的是,这仍然不起作用,也没有回到 [1]。 Aedix - 我不确定你的意思,你能否分享代码作为示例?
  • @chloealee 对不起,我只有几分钟的时间,我让自己被你的代码弄糊涂了。现在它可以工作并且应该产生预期的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2012-09-10
  • 2016-01-18
  • 2017-05-02
  • 2020-05-13
相关资源
最近更新 更多