Проблема PHP с использованием и объединением нескольких массивов в один - PullRequest
1 голос
/ 20 августа 2011

Я пытаюсь уточнить список поиска, чтобы, когда пользователь нажимает на флажки, он уточнял результаты на основе выбранных критериев.Вот PHP-функция, которую я использую:

function($criteria_a,$criteria_b,$criteria_c,$criteria_d){
   if($criteria_a==1){
      // build array
      $a_array=array($user_a,$user_e,$user_f);  
   }
   if($criteria_b==1){
      // build array
      $b_array=array($user_a,$user_c,$user_e);  
   }
   if($criteria_c==1){
      // build array
      $c_array=array($user_b);  
   }
   if($criteria_d==1){
      // build array
      $d_array=array($user_a,$user_e);  
   }
   $main_array = array_merge($a_array,$b_array,$c_array,$d_array);
}

По сути, когда пользователь нажимает на флажок критерия A (который может быть чем-то вроде «Показать тех, кому меньше 30»), он создает $a_array ссписок пользователей, которые соответствуют критериям.

Но проблема заключается в следующем: если я определил критерии A, B и D как 1, он заполняет $main_array пользователями, которые соответствуют any критериев вместо пользователей, которые удовлетворяют всем критериям.Основной массив будет выглядеть следующим образом:

array($user_a,$user_e,$user_f,$user_a,$user_c,$user_e,$user_a,$user_e);

Но я только хочу, чтобы он перечислял пользователей, которые соответствуют всем критериям:

array($user_a,$user_e);

Эти пользователи соответствуют каждому из указанных критериеввместо любого из указанных критериев.Я также не уверен, поможет ли это:

$acv = array_count_values($main_array);
arsort($acv);
$main_array = array_keys($acv);

Кто-нибудь знает, что я могу сделать?

Ответы [ 3 ]

1 голос
/ 20 августа 2011

Итак, вы хотите иметь массив, содержащий пользователей, присутствующих во всех заданных массивах?Это похоже на простой случай array_intersect.Используйте его для просмотра всех 4 массивов, и он создаст массив, содержащий все значения, которые появляются в каждом массиве.Чтобы все значения не отбрасывались, вам нужно установить для всех массивов значение по умолчанию, а затем изменить их в соответствии с критериями.

function($criteria_a,$criteria_b,$criteria_c,$criteria_d){
$a_array = $b_array = $c_array = $d_array = array($user_a,$user_b,$user_c,$user_d,$user_e,$user_f);
if($criteria_a==1) $a_array=array($user_a,$user_e,$user_f);  
if($criteria_b==1) $b_array=array($user_a,$user_c,$user_e);  
if($criteria_c==1) $c_array=array($user_b);  
if($criteria_d==1) $d_array=array($user_a,$user_e);  
$main_array = array_intersect($a_array,$b_array,$c_array,$d_array);
}

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

0 голосов
/ 20 августа 2011

array_merge() работает путем «склеивания» одного массива с другим, но не проверяет, являются ли значения уникальными.

Вы можете решить свою проблему двумя способами:

  • Используйте array_merge(), а затем array_unique() для удаления повторяющихся значений

  • Превратите эти массивы в ассоциативные массивы следующим образом:

    if($criteria_a==1){
        // build array
        $a_array=array($user_a,$user_e,$user_f);  
    }
    

    Когда вы используете array_merge() в ассоциативном массиве, будет только одно значение на ключ. Затем вы можете получить только значения с помощью array_values()

0 голосов
/ 20 августа 2011

Просто измените:

array_merge($a_array,$b_array,$c_array,$d_array);

Кому:

array_intersect($a_array,$b_array,$c_array,$d_array);

array_intersect()

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