В 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 3

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);

Просто пройдите через верхнее измерение основного массива и пересеките под-массивы.