Значение php insert в массиве массивов с использованием foreach

У меня довольно простой вопрос, но я застрял. Я довольно новичок в php, и у меня есть такой массив:

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

и для каждого из массивов в массиве (то есть «два», «три» и «четыре»), я хочу вставить «key3» => 'val3' в эти массивы.

Я попробовал это:

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

Но это не работает, и я не знаю, почему. Используя различные print_r по всему пространству, кажется, что он вставляет 'key3' => 'val3' в $ item, если я распечатываю его в цикле, но исходный массив кажется неизменным. Я также пробовал регулярный цикл, но это тоже не сработало.

foreach работает с копией $item , поэтому вы не можете изменить исходный массив внутри foreach . Один из способов обойти это – использовать оператор & .

 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, где были введены Closures.

PHP имеет функцию проверки, является ли переменная массивом или нет: is_array() . Использовать это:

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

в то время как цикл с использованием foreach используется как:

 foreach($array as $key => $item){ $array[$key]['newElement'] = "newValue"; }