У меня есть многомерный массив, как показано ниже:
$data = array (
'department1' =>array(
'user1' => array(
'building1' => array(
'room1' => array(
'active' =>'false'
),
'room2' => array(
)
),
'building2' => array(
'room4' => array(
),
'room3' => array(
)
),
)
)
);
То, что я пытаюсь сделать, это проверить комнату, если ноль или нет. Если ноль, я должен установить значение active => test
,
Код, который я сделал до сих пор:
foreach($data as $departments => $department){
foreach ($department as $users => $user){
foreach($user as $buildings => $building) {
foreach($building as $key => $value){
if ($data[$departments][$users][$buildings][$key] == null) {
$data[$departments][$users][$buildings][$key]['active'] = 'test';
}
}
}
}
}
Это работает, но я хочу знать, есть ли лучший способ реализовать его, не используя много foreach.
Мой вывод:
Array
(
[department1] => Array
(
[user1] => Array
(
[building1] => Array
(
[room1] => Array
(
[active] => false
)
[room2] => Array
(
[active] => test
)
)
[building2] => Array
(
[room4] => Array
(
[active] => test
)
[room3] => Array
(
[active] => test
)
)
)
)
)
Любая помощь? Спасибо.
Используйте следующую рекурсивную функцию, которая принимает и возвращает значение по ссылке (может использоваться с любой глубиной / иерархией элементов):
function &checkRoom(&$data) {
foreach ($data as $k => &$v) {
if (strpos($k, "room") === 0 && empty($v)) $v = ["active" => "test"];
if (is_array($v)) checkRoom($v);
}
return $data;
}
$data = checkRoom($data);
print_r($data);
Выход:
Array
(
[department1] => Array
(
[user1] => Array
(
[building1] => Array
(
[room1] => Array
(
[active] => false
)
[room2] => Array
(
[active] => test
)
)
[building2] => Array
(
[room4] => Array
(
[active] => test
)
[room3] => Array
(
[active] => test
)
)
)
)
)
Ты можешь использовать array_walk_recursive()
пройти через ваш $data
массив без необходимости foreach на каждом уровне глубины.
array_walk_recursive($data, function (&$value, $key) {
if (is_null($value) && $key == 'active') {
$value = 'test';
}
});
Приведенный выше пример кода будет проходить через ваш $data
массив и изменить каждый элемент с ключом «активный», который имеет значение «NULL» на значение «тест».
Обратите внимание, что ключ «активный» должен быть установлен для того, чтобы это работало.