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