Значение 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 повсюду, кажется, что в "item item" вставляется значение "key3" = > 'val3', если я распечатаю его в цикле, но исходный массив кажется неизменным. Я также пробовал регулярный цикл, но это тоже не сработало.
Ответы
Ответ 1
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.
Ответ 2
PHP имеет функцию для проверки того, является ли переменная массивом или нет: is_array()
. Используйте это:
if (is_array($item)) { ...
Ответ 3
во время цикла с использованием команды foreach:
foreach($array as $key => $item){
$array[$key]['newElement'] = "newValue";
}