Php 如何迭代在迭代过程中增长的数组中的*all*值?

Php 如何迭代在迭代过程中增长的数组中的*all*值?,php,arrays,foreach,iteration,dynamic-arrays,Php,Arrays,Foreach,Iteration,Dynamic Arrays,下面的示例不起作用,因为foreach可以处理数组的副本,但它从概念上展示了我想要实现的目标 $items = array('a', 'b', 'c', 'd'); foreach ($items as $i) { echo $i; if ($i === 'c') { $items[] = 'e'; } } 我想让它打印“abcde”,但出于上述原因,它只打印“abcd”。我已经查看了array\u map和array\u walk等,但还没有找到解决方案。您可以使用whi

下面的示例不起作用,因为
foreach
可以处理数组的副本,但它从概念上展示了我想要实现的目标

$items = array('a', 'b', 'c', 'd');
foreach ($items as $i) {
  echo $i;
  if ($i === 'c') {
    $items[] = 'e';
  }
}

我想让它打印“
abcde
”,但出于上述原因,它只打印“
abcd
”。我已经查看了
array\u map
array\u walk
等,但还没有找到解决方案。

您可以使用
while
循环(也可能是正常的
for
循环),它在每次迭代后评估退出条件。请注意,在此代码中,
$i
已更改为索引,因此您可以使用
$items[$i]
获取实际字符

$items=array('a','b','c','d');
$i=0;
而($i
另一种变体使用
而不需要计数。如果需要,还可以使用关联数组并检索
$k
中的键:

while(list($k, $i) = each($items)) {
  echo $i;
  if ($i === 'c') {
    $items[] = 'e';
  }
}
或者使用
for
循环,但这将在包含布尔
false
或计算结果为
false
的任何元素处停止:

for($i = reset($items) ; $i ; $i = next($items)) {

简单而朴素的解决方案:在循环前保存数组长度,在循环后比较-是否更大?然后对新添加的元素进行迭代,我会称之为竞争条件不清楚为什么需要它,但是
while($counter@kingkero这个问题比你想象的要复杂得多。我还解释了foreach不起作用的原因,并且我还研究了其他php函数。似乎错过了第一个值“a”。太好了!这是我希望得到的优雅答案,谢谢。没问题。为
循环添加了一个
。这个解决方案看起来非常干净,但看起来很简单添加项将使数组指针保持不变。似乎没有关于此行为的明确文档,因此感觉有点风险,因为它可能会与未来的PHP版本中断。您有任何见解或参考吗?@GolezTrol for
for
reset
的循环似乎会解决这个问题,不是吗?我想这仅在键是数字时有效。如果键是字符串怎么办?无论键是什么,count都将返回数组长度。@Odegard数组是给定的。它没有键。另外
$items[]
不会引入新钥匙。如果您提出问题,请明确您需要什么。@Odegard稍作修改后,这就像一个符咒一样有效:@Burimi确实需要。谢谢。
for($i = reset($items) ; $i ; $i = next($items)) {