1

私はこの次のコードを持っています:

foreach ($animals as $animal) {
    $animal = getOffSpring($animal);
}

$ animalを新しい文字列に設定しているので、配列も変更しますか?

私の実行では、配列は同じままであることが示唆されていますが、新しい値で変更する必要があります。これはバグですか?

言い換えれば、配列内のすべての動物を子孫に変更する必要があります

4

3 に答える 3

4

あなたはそれをやろうとしていると思います。
変数を取得$animalして関数に渡すか、foreachループ内で変更すると、独立変数を操作します。これは、$animals配列にリンクされていないため(自分でリンクしない場合)、すべての変更が適用されます。$animalsアレイが変更されないようにしてください。

foreach ( $animals as $i => $animal )
{
    $animals[ $i ] = getOffSpring( $animal );
}

@AlecTMHが彼のコメントで述べたように、これarray_mapも解決策です。

array_map( 'getOffSpring', $animals );
于 2012-12-29T14:26:06.477 に答える
3

参照を使用できます:

foreach ($animals as &$animal) {
    $animal = getOffSpring($animal);
}
unset($animal);

unsetafterループは参照をクリアします。それ以外の場合は、ループの後に最後の配列要素への参照を保持します。$animalこれを忘れて、$animal後で別の目的で使用すると、厄介な問題が発生します。

別のオプションは、キーを使用してキーを置き換えることです。

foreach ($animals as $key => $animal) {
    $animals[$key] = getOffSpring($animal);
}
于 2012-12-29T14:26:56.710 に答える
0

配列内の値への参照を使用できます

foreach ($animals as &$animal) {
    $animal = getOffSpring($animal);
}
于 2012-12-29T14:27:48.013 に答える