У меня довольно простой вопрос, но я застрял. Я довольно новичок в 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"; }