Я столкнулся с проблемой фильтра многомерного массива. Допустим, у меня было более 3 или 50 уровней массивов внутри массива. Как мы можем фильтровать их по паре ключ-значение?
например:
$arr = [
[ 'key' => 1, 'canView' => false, 'child' => [
['key'=> 10, 'canView' => true]
],
['key' => 2, 'canView' => false],
['key' => 3, 'canView' => true, 'child' => [
['key'=> 10, 'canView' => true, 'child' => [
['key'=> 10, 'canView' => true]] //and so on...
],...
],
['key' => 4, 'canView' => false],
['key' => 5, 'canView' => false],
];
а затем с помощью filterArray($array, $key, $condition)
отфильтруйте те дочерние элементы и элементы, которые имеют 'canView' => false
.
Ожидаемый результат из приведенного выше примера:
key 10
: удалено, поскольку его родительский key 1
имел 'canView' => false
и все остальные 'canView'=>false
также будут удалены, останутся только те, которые и у него, и у его родителя (если есть) были атрибуты 'canView' => true
.
Я пробовал этот код, но он фильтрует только массив 1-го уровня.
function filterArray($array, $key, $value)
{
foreach ($array as $subKey => $subArray) {
if ($subArray[$key] == $value) {
unset($array[$subKey]);
}
}
return $array;
}
Как мы можем превратить его в рекурсивный цикл, который автоматически определяет наличие еще одного дочернего массива?
Для этого я предлагаю вам заменить код под foreach ($array as $subKey => $subArray) {
на данный код. Данный код поможет вам в работе с вложенными массивами.
if ( isset( $subArray[$key] ) && $subArray[$key] == $value ) {
unset( $array[$subKey] );
} elseif ( isset( $subArray['child'] ) ) {
$array[$subKey]['child'] = filterArray( $subArray['child'], $key, $value );
if ( empty( $array[$subKey]['child'] ) ) {
unset( $array[$subKey]['child'] );
}
}
Чтобы рекурсивно работать с массивом, вы можете рекурсивно вызывать свою собственную функцию для «дочерних» клавиш.
function filterArray($array, $key, $value){
foreach ($array as $subKey => $subArray) {
if ($subArray[$key] == $value) {
unset($array[$subKey]);
} elseif (!empty($subArray['child']) && is_array($subArray['child'])) {
$array[$subKey]['child'] = filterArray($subArray['child'], $key, $value);
}
}
return $array;
}
Можно быстро исправить. Смотрите обновление.
большое спасибо, это сработало. Теперь я знаю, где я делаю это неправильно. Я только проверяю, была ли зацикленная цель массивом, чтобы рекурсивно вызвать метод.
Было бы лучше выполнять рекурсивный вызов только тогда, когда условие ложно.