web-dev-qa-db-ja.com

phpforeachを使用して配列の配列に値を挿入します

かなり基本的な質問がありますが、行き詰まっています。私はphpを初めて使用し、次のような配列を使用しています。

$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をあちこちで使用して、ループで出力すると$ itemに 'key3' => 'val3'を挿入しているように見えますが、元の配列は変更されていないようです。通常のforループも試しましたが、それも機能しませんでした。

15
Benjamin Thvedt

foreach _$item_のコピーで機能するため、foreach内の元の配列を変更することはできません。これを回避する1つの方法は、_&_演算子を使用することです。

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

もう1つのよりエレガントな方法は、 array_walk() を使用することです。

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

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

22
kapa

次のようなforeachuseキーでループしている間:

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

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

}
0
Asad

PHPには、変数が配列であるかどうかをチェックする関数is_array()があります。これを使って:

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