2012-02-29 12 views
2

配列の一部の値のみを直接更新しようとしています。どちらが完璧に働いていますか?私は次のメソッドを使用しています:&Array() - 配列の更新後にアンパサンドが付加された最後の行

foreach($items as &$item) { 
    if($criteria == 'correct') { 
     // update array 
     $item['update_me'] = 'updated'; 
    } 
} 

これで、$ itemsという更新された配列が作成されました。

しかし、私が持っている問題は、この配列が(別のforeachループを介して)画面に出力され、配列の最後の行が見つからない場合です。

アレイ全体をvar_dump($ items)で出力すると、メソッドでは、各行にArray(9)という接頭辞が付いています。しかし、最後の行には接頭辞& Array(9)が付いています。先行するアンパサンドに注意してください。私はこれが重要だと確信しています!しかし、私はそれが何を意味するのか分かりません。配列の最後の行にのみ適用されるのはなぜですか?そしてどうすればそれを取り除くことができますか?コメントから

array(6) { 
    [0]=> array(9) { 
     ["item_id"]=> string(4) "1" 
     ["item_description"]=> string(9) "blah blah" 
     ["quantity"]=> string(1) "4" 
     ["unit_cost"]=> string(4) "5.00" 
     ["subtotal"]=> string(4) "20.00" 
    } 
    [1]=> &array(9) { 
     ["item_id"]=> string(4) "2" 
     ["item_description"]=> string(9) "blah blah" 
     ["quantity"]=> string(1) "1" 
     ["unit_cost"]=> string(4) "5.99" 
     ["subtotal"]=> string(4) "5.99" 
    } 
} 
+0

関連するすべてのコードを表示します。関連する出力を表示します。あなたが使っている言語を教えてください。 – Marcin

+0

テストケースお願いします。 –

+0

うまくいけば今すぐ修正する必要があります。しかし、ここに参考のために出力があります: 'array(6) {[0] => array(9) \t {[item_id]] => string(4)" 1 " \t [ ITEM_DESCRIPTION "] =>列(9) "何とか何とか" \t [" 量 "] =>列(1) "4" \t [" UNIT_COST "] =>列(4) "5.00" \t [" 小計"] =>列(4) "20.00" \t} [1] =>&アレイ(9) \t {[" ITEM_ID "] =>列(4) "2" \t [" ITEM_DESCRIPTION "] =>文字列(9) "blah blah" \t [数量] =>文字列(1) "1" \t [ "UNIT_COST"] =>の文字列(4) "5.99" \t [ "小計"] =>の文字列(4) "5.99" \t}} ' – user1100149

答えて

1

私はそうするのが一番いい方法ではないと思います。私はこのようにすることをお勧めします:

foreach(array_keys($items) as $itemkey) { 
    if($criteria == 'correct') { 
     // update array 
     $items[$itemkey]['update_me'] = 'updated'; 
    } 
} 
+0

これはもっとうまくいくようです!それが妨げられていないことを確認するためにちょっとしたテストをする必要がありますが、それほど良いことはありません。ありがとう。 – user1100149

5

私はそれがここケースであるかどうかわからないんだけど、参照が後に未設定のない場合は、参照によるforeach文は問題のこれらの種類を引き起こすことが知られていますループ(それについての警告がありますin the manual)です。 foreachが終了した直後にunset($item);を追加し、問題が解決するかどうか確認してください。

+0

それは面白いです。下の解決策はうまくいったようですが、私もこれを好奇心から試してみるかもしれません。 – user1100149

11

ループの後に$ itemを解除する必要があります。正しいコード:

foreach($items as &$item) { 
    if($criteria == 'correct') { 
     // update array 
     $item['update_me'] = 'updated'; 
    } 
} 
unset($item); 

&符号のvar_dump結果では、これは参照であることを指定します。あなたはxdebug_zval_dump()関数を使って、それを確認することができます:

xdebug_zval_dump($item) 

あなたは本当のことis_refを=表示されます。 PHPでは、これは同じzvalコンテナを指す別の変数があることを意味します(zvalとは何ですか?http://php.net/manual/en/internals2.variables.intro.php参照)。 ループで&を使用している場合は、検出困難なエラーを避けるために、ループの後に参照を設定解除する必要があります。

関連する問題