У меня есть глубокий вложенный многомерный массив. Я хочу иметь возможность искать несколько пар ключ / значение и возвращать их родительские совпадения.
Пример массива:
//$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'tPanic. Я обновил свой вопрос, чтобы, надеюсь, уточнить.
Вы можете использовать библиотеку 'treewalker', чтобы помочь вам здесь ----> github.com/lukascivil/TreeWalker






Возможно, вам поможет следующая рекурсивная функция; вы можете изменить ключ, который ищете ($ 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 Я давно искал что-то подобное! Не могли бы вы объяснить, как мне вернуть значение искомого ключа? например вернуть «Мое имя», чтобы я мог присвоить его переменной, а не числам и ключам массива?
Не уверен, что это именно то, что вам нужно, но может быть что-то вроде это ... - новый код между /* NEW */ и /* END NEW */. Дело в том, что у вас может быть несколько "совпадений" для одного и того же ключа (например, "Name") во вложенных массивах, поэтому вам понадобится массив $results для их хранения. Затем вы можете перебирать массив результатов, чтобы присвоить найденные значения вновь созданным переменным, используя нотацию $$. Надеюсь, это поможет?
Ваше описание немного расплывчато. Добавление нескольких примеров ожидаемого результата различных входных данных действительно поможет прояснить, что вы пытаетесь получить.