Найти, существуют ли все элементы в одном многомерном массиве в другом (используя многомерный массив как стог сена)

#php #arrays #multidimensional-array

#php #массивы #многомерный массив

Вопрос:

Я пытался использовать некоторую логику, чтобы иметь возможность видеть, все ли элементы в многомерном массиве (стоге сена) выходят в другой, гораздо больший стог сена. Мой первый стог сена в первую очередь состоит из объекта json, а второй — это строка «имя точки», которая также преобразуется в массив. Логика здесь в том, что я могу использовать строку, описывающую то, что я ищу в json простым способом:

Игла:

 Array
(
    [key1] => Array
        (
            [provider] => Array
                (
                    [id] => 1
                )

        )

    [key2] => Array
        (
            [consumer] => Array
                (
                    [id] => 5
                )

            [hostname] => foo
        )

)
 

Стог сена:

            [0] => Array
                (
                    [id] => 1000
                    [consumer] => Array
                        (
                            [id] => 5
                            [name] => test
                    [hostname] => foo
           [1] => Array
                (
                    [id] => 1200
                    [provider] => Array
                        (
                            [id] => 5
                            [name] => test
                   
 

Если игла существует в массиве, должен быть возвращен верхний ключ. Поэтому, если мы притворимся, что все key-> значения ниже «key2» существуют в массиве, мы должны вернуть key2. provider-id и consumer-id не совпадают, и могут быть другие ключевые значения, которые могут выглядеть одинаково, но имеют другой путь. так что, если «имя хоста» будет существовать, но гораздо глубже в массив, который не соответствует.

Проблема в том, что все примеры, с которыми я сталкивался, либо имеют:

  • Фиксированная глубина в массиве.
  • Имея иглу в виде строки.
  • Не является истинно многомерным.

Есть ли способ, которым это можно сделать? recursiveiteratoriterator мне пришел в голову, но я не уверен, как его использовать, исходя из вышесказанного.

Я также просмотрел различные рекурсивные примеры in_array / is_array / array_map / array_filter, но они немного запутаны, и я не мог решить, стоит ли пытаться создать что-то, что позволило бы хорошо сканировать два массива.

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

Спасибо за чтение.

Комментарии:

1. Я в замешательстве. Я не понимаю, что вы ищете (возможно, вы путаете термины «игла» и «стог сена») или каким будет ваш ожидаемый результат. Можете ли вы создать конкретный, упрощенный пример входных данных и ожидаемого результата?

2. Понятно, вы правы. В примере, который я показал, была моя игла, а не стог сена. Если needle и haystack идентичны ниже «key2», я ожидаю, что результатом функции или класса будет «key2», что означает, что consumer-> id-> 5 и hostname-> foo для обоих существует в массиве

3. Я все еще не понимаю структуру. Пожалуйста, отредактируйте вопрос, чтобы показать пример иглы (значение, которое вы ищете) и пример стога сена (массив, в котором вы ищете).

4. Конечно, я отредактировал сообщение. Спасибо

5. Да, это не будет работать через встроенные функции. Вам придется написать пользовательский, поскольку форматы не совпадают. Вам также понадобится рекурсия, если вы не знаете, на каком уровне вы можете найти совпадение.