0

我有一个循环需要遍历每个项目。所以自然地,foreach 循环似乎是最好的主意。但是,我需要在迭代时向数组中添加一个元素。我尝试了以下没有任何运气。

foreach ($allitems as $item) {
    //Do some stuff here

    if ($value === true)
        $allitems[] = 'New item';
}

我发现 foreach 循环似乎使用了数组的引用副本,因此编辑数组不会在循环中注册。

一种解决方法是使用旧样式的 while 循环,如下所示:

while (list($key, $item) = each($allitems)) {
    //Do some stuff here

    if ($value === true)
        $allitems[] = 'New item';
}

显然,foreach 循环会更好、更高效。可能吗?还是 while 结构是最好的解决方案。

4

3 回答 3

2

是的,有可能:

foreach ($allitems as &$item) {
    //Do some stuff here

    if ($value === true)
        $allitems[] = 'New item';
}

根据文档,您需要传递一个引用(使用&前面的 if $item)

更具体的例子:

<?php
$allitems = array(1,2,3,4);

foreach ($allitems as &$item) {
     echo $item."\n";
     if ($item == 2) {
          $allitems[] = "Blah";
     }
}
?>

这输出(从命令行使用 php)

1
2
3
4
Blah
于 2013-06-19T23:34:13.247 回答
1

似乎一个普通的for循环最适合这个:

for ($i = 0; $i < count($array); $i++) {
  // Do some stuff here that calculates $value from $array[$i]
  if ($value === true) {
    $array[] = "New Element";
  }
}
于 2013-06-20T00:19:41.447 回答
0

你可以这样做 foreach ......像这样......

但它添加了更多代码......所以它并不比你的while循环更好......

foreach($array as $val){
  if($val=="check"){$append[]="New Item";}
}
$array = array_merge($array, $append);

当然,如果你想维护你的结构..那么宁愿使用 array_push

于 2013-06-19T23:34:42.853 回答