Сократите использование foreach в массиве при проверке нулевых значений. Переполнение стека

У меня есть многомерный массив, как показано ниже:

 $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
)

)

)

)

)
Любая помощь? Спасибо.

4

Решение

Используйте следующую рекурсивную функцию, которая принимает и возвращает значение по ссылке (может использоваться с любой глубиной / иерархией элементов):

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
)

)
)
)
)
1

Другие решения

Ты можешь использовать array_walk_recursive() пройти через ваш $data массив без необходимости foreach на каждом уровне глубины.

array_walk_recursive($data, function (&$value, $key) {
if (is_null($value) && $key == 'active') {
$value = 'test';
}
});

Приведенный выше пример кода будет проходить через ваш $data массив и изменить каждый элемент с ключом «активный», который имеет значение «NULL» на значение «тест».

Обратите внимание, что ключ «активный» должен быть установлен для того, чтобы это работало.

Ресурсы

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector