Php проверяет, существует ли значение во всех многомерных массивах

В настоящее время я схожу с ума от того, как это сделать, по сути, у меня есть многомерный массив, и мне нужен код для проверки всех значений и наличия значения во всех массивах, а не для возврата результата.

Родители visitPoints,острова,животные всегда будут существовать, хотя иногда и пустые, столбцы второго уровня являются динамическими, поэтому изменяются ключи 20,35,57 и их содержимое.

$array = [
    'visitPoints'=>[
        20=>[2,5,6,8,10,11],
        35=>[2,5,6],
        57=>[1],
    ],
    'islands'=>[
        20=>[5,10,11],
        35=>[5,6]
    ],
    'animals'=>[
        20=>[5,11],
        35=>[]
    ]
];

И результат, который я ищу, таков:

$result = [
    20=>[5,11],
    35=>[],
    57=>[]
];

играл с call_user_func_array('array_intersect', $array), но не смог получить искомый результат.

Вот пример ссылки: https://3v4l.org/meX5p

Что вы пробовали? Где ты застрял? См. также Как задавать и как составить минимально воспроизводимый пример вашей проблемы.

ADyson 14.03.2024 21:17

@ADyson попробовал некоторые варианты в автономном режиме, но ими не стоит делиться, поскольку они не имеют смысла.

Ered 14.03.2024 21:18

Будут ли все столбцы всегда существовать во всех массивах? Можем ли мы всегда быть уверены, что столбцы второго уровня будут доступны (например, 20 и 35)?

mickmackusa 14.03.2024 21:44

Всегда ли известна глубина? Всегда ли структура одинакова?

FiddlingAway 14.03.2024 21:44

то, что всегда будет существовать, - это родительские точки посещения, острова, животные, хотя иногда они пусты, столбцы второго уровня являются динамическими, поэтому ключи 20,35 меняются и их содержимое.

Ered 14.03.2024 21:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
5
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, что-то вроде этого? Проверьте это здесь.

$array = [
    'visitPoints'=>[
        20=>[2,5,6,8,10,11],
        35=>[2,5,6]
    ],
    'islands'=>[
        20=>[5,10,11],
        35=>[5,6]
    ],
    'animals'=>[
        20=>[5,11],
        35=>[]
    ]
];

function checkExisting($arr) {
    $result = [];
    $pass = 0;
    foreach($arr as $firstLvlKey=>$firstLvlArray) {
        $pass++;
        foreach($firstLvlArray as $secondLvlKey=>$secondLvlArray) {
            if ($pass === 1) {
                $result[$secondLvlKey] = $secondLvlArray;
            } else {
                $result[$secondLvlKey] = array_intersect($result[$secondLvlKey],$secondLvlArray);
            }
        }
    }
    
    return $result;
}

print_r(checkExisting($array));

РЕДАКТИРОВАТЬ

Я заметил, что при этом будут сохранены индексы третьего уровня исходного массива (в данном случае индексы 1 и 5). Если вы не возражаете против этого, вы можете использовать приведенный пример. Если вам нужно сбросить индексы (т. е. 0 => 5, 1=> 11 и т. д.), вы можете сделать что-то вроде этого:

$array = [...];

function checkExisting($arr) {
    $result = [];
    $pass = 0;
    foreach(...) {
        $pass++;
        foreach(...) {
            if ($pass === 1) {
                $result[$secondLvlKey] = $secondLvlArray;
            } else {
                // the part below matters - wrap everything in array_values(...)
                $result[$secondLvlKey] = array_values(array_intersect($result[$secondLvlKey],$secondLvlArray);)
            }
        }
    }
    
    return $result;
}

print_r(checkExisting($array));
Ответ принят как подходящий

Изолируйте первое подмножество и примените его к результату, затем повторите оставшиеся подмножества, следуя ключам результирующего массива, и отфильтруйте соответствующие строки с возвратом к пустому массиву, когда строка результата не найдена для соответствующего ключа. (Демо)

$result = array_shift($array) ?? [];
foreach ($array as $rows) {
    foreach ($result as $k => $row) {
        $result[$k] = array_values(array_intersect($row, $rows[$k] ?? []));
    }
}
var_export($result);

Я включу в результат нулевое объединение на случай, если входной массив пуст.

любой шанс, что мы можем обусловить, что ключ отсутствует во всех 3, чтобы не возвращать его, вот пример 3v4l.org/VS2LE ключ 57 отображается только в точках посещения, а не в остальных, поэтому он недействителен и его следует игнорировать.

Ered 14.03.2024 22:15

Это было моей первоначальной заботой. Я обновлю свой ответ после того, как вы обновите свой вопрос. Может ли уникальный ключ быть найден только в более позднем подмассиве? Чем сложнее ваш минимально воспроизводимый пример , тем лучше будут ответы.

mickmackusa 14.03.2024 22:19

Я ценю ваше время и помощь.

Ered 14.03.2024 22:40

могу ли я заменить $result[$k] на $row?

Ered 14.03.2024 22:43

Да, извини, хороший улов. Я почистил свой фрагмент.

mickmackusa 15.03.2024 03:09

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