В PHP пересекаются массива в многомерный массив с неизвестным количеством ключей
Я пытаюсь сделать расширенные фильтры поиска в приложении, которое содержит ресурсы (людей). У меня есть все результаты в 1 многомерном массиве. Пользователь приложения может искать людей по должности, навыкам, области работы и стране.
Я уже сделал часть, где я ищу людей, которые отвечают критериям, заданным пользователем. Эти результаты хранятся в многомерном массиве. Если пользователь ищет кого-то с определенным ресурсом с названием должности и специфический навык возвращаемое значение таково:
$realfilters = array(2) {
["resourcesWithJobtitle"]=> array(6) {
[0]=> string(1) "1"
[1]=> string(2) "48"
[2]=> string(2) "88"
}
["resourcesWithSkill"]=> array(9) {
[0]=> string(1) "4"
[1]=> string(1) "8"
[2]=> string(1) "48"
[3]=> string(2) "50"
}
Когда пользователь также ищет рабочее поле, это добавляется к результату:
["resourcesWithWorkfield"]=> array(3) {
[0]=> string(2) "48"
[1]=> string(2) "96"
[2]=> string(2) "97"
}
Мне нужно знать, какие ресурсы соответствуют всем измерениям массива, чтобы я мог их отобразить. (Поэтому в этом примере мне нужен массив только с 1 значением: 48). Я думаю, что мне нужно использовать array_intersect
, но, кажется, не могу сделать это правильно.
3 ответа:
Одно из возможных решений: вы можете сначала
extract()
значения массива$realfilters
для переменных, а затем применить к нимarray_intersect()
. Но это решение применимо только в том случае, если существует не так много возможных фильтров.Еще одним и, вероятно, лучшим решением было бы пересечение в цикле, что-то вроде:
$res_arr = array_shift($realfilters); foreach($realfilters as $filter){ $res_arr = array_intersect($res_arr, $filter); }
$intersection = call_user_func_array('array_intersect', $array);
Это даст вам элементы, присутствующие в всех под массивах $array.
Править- Это выше похоже на ярлык для написания:
$intersection = array_intersect($array['a'], $array['b'], ...and so on for all elements...);
Также можно использовать цикл
$intersection = reset($array); foreach ($array as $subarr) { $intersection = array_intersect($intersection, $subarr); } print_r($intersection);