2013-05-10 46 views
13

私はかなり基本的な質問がありますが、私は立ち往生しています。私は、PHPにかなり新しいですし、私はこのような配列があります。php foreachを使って配列の配列に値を挿入

$array = array(
    'one' => 1, 
    'two' => array('key1' => 'val1','key2' => 'val2'), 
    'three' => array('key1' => 'val1','key2' => 'val2'), 
    'four' => array('key1' => 'val1','key2' => 'val2') 
); 

と、アレイ内のアレイのそれぞれについての(つまり、「2 『3』、および 『4』)、私がしたいですこれらの配列に 'key3' => 'val3'を挿入します。

foreach($array as $item) { 
    if (gettype($item) == "array") { 
     $item['key3'] = 'val3'; 
    } 
} 

しかし、それは動作しません、と私はなぜわからない:

は、私はこれを試してみました。場所の中のいろいろなprint_rを使うと、ループでそれを印刷すると 'key3' => 'val3'を$ itemに挿入するように見えますが、元の配列は変更されていないようです。私も定期的なループを試みたが、どちらもうまくいきませんでした。

+0

キーとその値を行い、各サブアレイのために等しくされていますか? – SaidbakR

+0

なぜあなたは 'foreach($ array as $ item_key => $ item){$ array [$ item_key] ['key3'] = 'val3'; } ' – westcoast

答えて

20

foreachは、$itemのコピーで動作します。これを回避する1つの方法は、&演算子を使用することです。

foreach($array as &$item) { 
    if (is_array($item)) { 
     $item['key3'] = 'val3'; 
    } 
} 

別の、よりエレガントな方法は、array_walk()を使用することです:

array_walk($array, function (&$v, $k) { 
    if (is_array($v)) { 
     $v['key3'] = 'val3'; 
    } 
}); 

この例では、クロージャが導入されたPHP 5.3から動作します。

+0

$ itemはループに対してのみ生成されます。あなたは '&$ array ['key3'] = 'val3';'を意味します! –

+0

@ moskito-x私が書いたことを確かに意味します。それがポイントです。私がリンクしている 'foreach'マニュアルページを確認してください。 – kapa

+0

$ itemを変更するのは無駄です。次のループによって常に上書きされます。 –

0

PHPには、変数が配列かどうかをチェックする関数があります:is_array()。これを使用する:あなたはforeach内側にあなたの元の配列を変更することはできませんので

if (is_array($item)) { ... 
0

のようなforeachの使用キーでループしながら:

foreach($array as $key => $item){ 

    $array[$key]['newElement'] = "newValue"; 

} 
+1

質問に対する答えではありませんが、これは '$ key'と' $ item'の関係を理解するのに役立ちました。 –

関連する問題