Intereting Posts
Получение разрешения отклонено во время публикации xml с помощью Curl? отправьте форму с помощью флажка PHPExcel Записывает нежелательные символы при запуске кода на AWS. Получить конечный URL из двойного укороченного URL (t.co -> bit.ly -> final) Нужно ли мне избегать моих переменных, если я использую подготовленные операторы MySQLi? Пользовательский сценарий маршрутизации лития Выполнение функции javascript, возвращаемой из ответа AJAX (PHP) Сортировка многомерного массива по значению CodeIgniter: подсчет результатов из объединенной таблицы Как получить результат сложного шаблона Википедии? Каковы различия между обратным ходом и одинарной кавычкой? Могу ли я использовать оператор IF в запросе, как указано выше? Zend Framework: проверьте, установлен ли Zend View Placeholder WordPress Drag and Drop Widgets Отладка скрипта cron PHP Как защитить загружаемые файлы в удаленном каталоге от не-премиум-пользователей (в php?)

Объединяйте массивы, чтобы они содержали только повторяющиеся значения

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

//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. Как вы можете прочитать этот вопрос без везения.

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

Насколько я понимаю, вы хотите иметь двухэтапный процесс:

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

Для первого шага вам нужно найти продукты, соответствующие каждому выбранному варианту. Например, если пользователь ищет продукты, имеющие какие-либо из вариантов 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 во ВСЕХ выбранных группах фильтров.

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

Я надеюсь, что это помогает 🙂