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';
}

docsによると、参照を渡す必要があります(&前に 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 に答える