PHP Поиск глубокого вложенного массива для нескольких комбинаций ключ / значение

У меня есть глубокий вложенный многомерный массив. Я хочу иметь возможность искать несколько пар ключ / значение и возвращать их родительские совпадения.

Пример массива:

//$array
Array
(
[0] => Array
        [ID] => 1
        [Name] => My Name
        [GroupLocations] => Array
            (
                [0] => Array
                    (

                        [GroupId] => 111
                        [LocationId] => 222 
                        [Location] => Array
                            (
                                [Name] => My Location
                                [Street1] => 555 Somewhere Lane
                                [City] => City
                                [County] => County
                                [State] => CA
                                [Country] => US
                                [PostalCode] => 00000
                            )
                    )

            )
    )
[1] => Array
        [ID] => 2
        [Name] => My Other Name
        [GroupLocations] => Array
            (
                [0] => Array
                    (

                        [GroupId] => 222
                        [LocationId] => 333 
                        [Location] => Array
                            (
                                [Name] => My Other Location
                                [Street1] => 666 Other Rd.
                                [City] => City
                                [County] => County
                                [State] => CA
                                [Country] => US
                                [PostalCode] => 00000
                            )
                    )

            )
    )
)

Что-то похожее на PHP поиск в массиве нескольких пар ключ / значение, но с учетом более глубоких уровней.

Итак, если у меня есть пример массива выше и я хочу отфильтровать массив и получить результаты на основе фильтров, которые должны искать разные вложенные части массива

$filters = array(
  'ID' => $_GET[‘ID’],
  'LocationId' => $_GET['LocationId']
);

$results = filterMyArray($array, $filters);

Где функция filterMyArray будет рекурсивно фильтровать все уровни с помощью массива фильтров и возвращать все соответствующие индексы /. Пытаюсь найти достойное решение. Любые предложения о том, как это сделать?

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

Don't Panic 05.07.2018 17:34

Спасибо, что заглянули в @ Don'tPanic. Я обновил свой вопрос, чтобы, надеюсь, уточнить.

1cor22 05.07.2018 20:14

Вы можете использовать библиотеку 'treewalker', чтобы помочь вам здесь ----> github.com/lukascivil/TreeWalker

CSSBurner 05.07.2018 20:23
Стоит ли изучать 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
3
674
1

Ответы 1

Возможно, вам поможет следующая рекурсивная функция; вы можете изменить ключ, который ищете ($ key), и он вернет все вхождения ключа во вложенном / многомерном массиве.

<?php
$arr = [
    [
        'ID' => 1,
        'Name' => 'My Name',
        'GroupLocations' => [
            [
                'GroupId' => 111,
                'LocationId' => 222,
                'Location' => [
                    'Name' => 'MyLocation',
                    'Street1' => '555 Somewhere Lane'
                ]
            ]
        ]
    ]   
];

$results = []; // the container for the search result(s)
$key = 'Name'; // the key we are looking for
findKey($arr, $key, $results); // invoke the search function

/** print the result of our search */
echo '<pre>';
var_dump($results);
echo '<pre>';

/**
 * @param array $arr the multidimensional array we are searching
 * @param string $key the key we are looking for
 * @param $results           passed by reference - in case the key is found, this array 'stores' the corresponding key-value pair.
 */
function findKey($arr = [], $key = '', &$results = [])
{
    foreach ($arr as $key0 => $value0) {
        if ($key0 == $key && !is_array($value0)) {
            $results[][$key] = $value0;
        }
        if (is_array($value0)) {
            findKey($value0, $key, $results);
        }
    }
    return false;
}

Выход:

array(2) {
  [0]=>
  array(1) {
    ["Name"]=>
    string(7) "My Name"
  }
  [1]=>
  array(1) {
    ["Name"]=>
    string(10) "MyLocation"
  }
}

Спасибо @lovelace Я давно искал что-то подобное! Не могли бы вы объяснить, как мне вернуть значение искомого ключа? например вернуть «Мое имя», чтобы я мог присвоить его переменной, а не числам и ключам массива?

Fixxer 11.12.2019 16:17

Не уверен, что это именно то, что вам нужно, но может быть что-то вроде это ... - новый код между /* NEW */ и /* END NEW */. Дело в том, что у вас может быть несколько "совпадений" для одного и того же ключа (например, "Name") во вложенных массивах, поэтому вам понадобится массив $results для их хранения. Затем вы можете перебирать массив результатов, чтобы присвоить найденные значения вновь созданным переменным, используя нотацию $$. Надеюсь, это поможет?

lovelace 11.12.2019 18:13

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