2015-07-14 2 views
1

Мы обновляем интернет-магазин, поэтому фильтрация немного отличается. Теперь мы просто получаем все идентификаторы продукта, которые связаны с одним или несколькими выбранными значениями фильтра.Объединить массивы, чтобы они содержали только повторяющиеся значения.

//Filter value '8 GB' 
$result[] = array(1,6,5,8,9); 

//Filter value 'AMD E' (and)OR 'INTEL' 
$result[] = array(1,5,8,9,10,500,502,503,600,607,608,...); 

«AMD E» и значение «» Intel от того же самого фильтра «Processor», поэтому мы хотели бы это вместе, как посетитель хотел бы, чтобы все продукты с AMD E или процессором INTEL.

Теперь мы хотели бы выбрать только идентификаторы, которые встречаются в обоих массивах. Мы уже пробовали кучу методов, но теперь мы просто не возвращаем то, что ожидаем в любом случае.

Проблема в том, что количество пар ключей => массива в $result является динамическим, как и число идентификаторов, возвращаемых SQL. когда первый массив в $result является коротким списком идентификаторов, array_intersect() не вернет все ожидаемые результаты, если в массиве $result имеется несколько массивов.

merge_array() будет просто комбинировать все. Таким образом, посетитель увидит ВСЕ продукты, которые имеют 8 ГБ памяти или которые содержат процессор AMD E или INTEL.

Мы ищем решение ('8 ГБ') И ('ADM E' или 'INTEL').

Все становится сложнее при активировании большего количества фильтров: ('8 ГБ' ИЛИ ​​'12 ГБ ') И (' ADM E 'ИЛИ' INTEL ') И (' HP 'ИЛИ' Apple 'ИЛИ' Sony ')

(Надеюсь, что я не потерять вы пытаетесь объяснить ситуацию и то, что мы пытаемся сделать сейчас: с)

мы также пробовали получать вещи сделано через SQL. Как вы можете прочитать в this question без везения.

Кто-нибудь занимался чем-то подобным раньше?

+0

Я не уверен, что понимаю. Вы хотите пересечение всех подматриц, хранящихся в массиве $ results? Если да, см. Мой ответ. Если не просьба уточнить –

+0

Ну да, мы бы хотели этого, но каким-то образом, если в первом субадресе содержится только 4 идентификатора, а более поздние массивы содержат больше, он будет проверять только позже на наличие 4 идентификаторов в первом подпункте -Архив .. Правильно? – Brainfeeder

+0

И что, если один из подмассивов пуст, так как для этого значения фильтра нет продуктов ... Вся функция не вернет никаких результатов. – Brainfeeder

ответ

3

Как я понимаю, вы хотите, чтобы процесс 2-шага:

  1. Найти все элементы, которые соответствуют любым критериям в данной фильтровальной группе
  2. Найти элементы, которые возвращаются во всех используемых фильтрах групп

Для первого шага вам нужно найти продукты, соответствующие каждому выбранному варианту. Например. если пользователь ищет продукты, которые имеют какие-либо из вариантов А, В или С, поместить результаты в массиве как:

$results = [ 
[1,2,3], // products that have option A 
[2,5,7], // products that have option B, 
[2,7,10] // products that have option C 
]; 

Теперь Вы можете получить идентификаторы всех продуктов, которые имеют какие-либо из этих вариантов использования

$ids = call_user_func_array('array_merge', $results); 

Это даст вам сумму массивов.

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

$result = [ 
    $ids1, // array of IDs that match ANY option from filter group 1 
    $ids2 // array of IDs that match ANY option from filter group 2 
]; 

Вы можете получить пересечение по звоните:

$ids = call_user_func_array('array_intersect', $results); 

Это даст вам идентификаторы продуктов, которые соответствуют ANY filter option во ВСЕХ выбранных группах фильтров.

Последнее, что вам нужно, это проверить, выбрал ли пользователь какие-либо фильтры. Если нет, не применяйте выше логики, а возвращайте все продукты.

Надеюсь, это поможет :)

+0

Для записи я пробовал это так, и, похоже, это работает, если я 'array_multisort (array_map ('count', $ result), SORT_DESC, $ result);' все, прежде чем делать пересечь функцию. – Brainfeeder

+0

Черт, я приветствовал рано. Если я не выберу фильтры, результат будет полностью пустым ... – Brainfeeder

+0

Мне это нравится, потому что мы думаем в одном направлении - это означает, что я не сходил с ума от этого ... В нашей ситуации шаг 1 обрабатывается с помощью запрос базы данных. Итак, у нас уже есть «объединенные массивы», готовые к шагу 2. Я проверю, не ошибся ли я. Но в прошлый раз, когда я тестировал этот метод, мы не возвращали ожидаемые результаты. По крайней мере, не во всех случаях. – Brainfeeder

Смежные вопросы