Рекурсивный цикл PHP для фильтрации элементов и подэлементов на основе условия ключа и значения

Я столкнулся с проблемой фильтра многомерного массива. Допустим, у меня было более 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;
      }

Как мы можем превратить его в рекурсивный цикл, который автоматически определяет наличие еще одного дочернего массива?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для этого я предлагаю вам заменить код под 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;
}

Было бы лучше выполнять рекурсивный вызов только тогда, когда условие ложно.

Olivier 24.07.2024 08:57

Можно быстро исправить. Смотрите обновление.

Koala Yeung 24.07.2024 09:12

большое спасибо, это сработало. Теперь я знаю, где я делаю это неправильно. Я только проверяю, была ли зацикленная цель массивом, чтобы рекурсивно вызвать метод.

Hùng Thái 24.07.2024 09:28

Другие вопросы по теме