Мы обновляем интернет-магазин, поэтому фильтрация немного отличается. Теперь мы просто получаем все идентификаторы продукта, которые связаны с одним или несколькими выбранными значениями фильтра.
//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» взяты из одного и того же фильтра «Процессор», поэтому мы хотели бы, чтобы они были объединены, поскольку посетитель хотел бы иметь все продукты с процессором AMD E OR или INTEL.
Теперь мы хотели бы выбрать только идентификаторы, которые встречаются в обоих массивах. Мы уже пробовали кучу методов, но теперь мы просто не возвращаем то, что ожидаем в любом случае.
Проблема в том, что количество пар ключей => массива в $result
является динамическим, как и число ID, возвращаемых SQL. когда первый массив в $result
является коротким списком идентификаторов, array_intersect()
не будет возвращать все ожидаемые результаты, если в $result
есть несколько массивов.
merge_array()
будет просто комбинировать все. Таким образом, посетитель увидит ВСЕ продукты, которые имеют 8 ГБ памяти или которые содержат процессор AMD E или INTEL.
Мы ищем решение ('8 ГБ') И ('ADM E' ИЛИ 'INTEL').
И все это осложняется, когда активируется больше фильтров: ('8 ГБ' ИЛИ '12 ГБ ') И (' ADM E 'ИЛИ' INTEL ') И (' HP 'ИЛИ' Apple 'ИЛИ' Sony ')
(Надеюсь, я не потерял тебя, пытаясь объяснить ситуацию и то, что мы сейчас пытаемся сделать: s)
Мы также пытались получить материал через SQL. Как вы можете прочитать этот вопрос без везения.
Кто-то раньше занимался чем-то подобным?
Насколько я понимаю, вы хотите иметь двухэтапный процесс:
Для первого шага вам нужно найти продукты, соответствующие каждому выбранному варианту. Например, если пользователь ищет продукты, имеющие какие-либо из вариантов A, B или C, поместите результаты в массив, например:
$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 во ВСЕХ выбранных группах фильтров.
Последнее, что вам нужно, это проверить, выбрал ли пользователь какие-либо фильтры. Если нет, не применяйте выше логики, а возвращайте все продукты.
Я надеюсь, что это помогает 🙂