Как сгенерировать запрос, используя массив столбцов с разделителями & amp; ценности

У меня есть этот массив:

$filter=['color*black','color*blue','color*red','paint*apex','paint*dalton'];

Каждое значение в $filter имеет две подстроки, разделенные *, Первая подстрока представляет столбец таблицы базы данных, а вторая представляет желаемое значение для этого столбца.

мой products таблица выглядит так:

id    name    color    paint
1     p1      black     compo
2     p2      red       dalton
3     p3      pink      apex
4     p4      blue      apex
5     p5      cream     compo

С помощью $filterМне нужно искать products таблицы и вернуть все строки с paint ценность apex или же dalton И color ценность black, blue, или же red,

Желаемым результатом является запрос MySQL, который будет возвращать только эти строки:

id    name    color    paint
2     p2      red       dalton
4     p4      blue      apex

2

Решение

Если вам нужно построить запрос как этот SELECT * FROM products WHERE (color IN ('black', 'blue', 'red')) AND (paint IN ('apex', 'dalton')), тогда код ниже может быть полезным (пожалуйста, проверьте его Вот):

$filter = array(
0 => "color*black",
1 => "color*blue",
2 => "color*red",
3 => "paint*apex",
4 => "paint*dalton");

$elements = [];

foreach ($filter as $value) {
list($before, $after) = explode('*', $value);
$elements[$before][] = $after;
}

$parts = [];

foreach ($elements as $column => $values) {
$parts[] = "(`$column` IN ('" . implode("', '", $values) . "'))";
}

$query = 'SELECT * FROM `products` WHERE ' . implode(' AND ', $parts);

Выполнение этого запроса к данной структуре данных таблицы:

id    name    color    paint
1     p1      black     compo
2     p2      red       dalton
3     p3      pink      apex
4     p4      blue      apex
5     p5      cream     compo

будет соответствовать следующим строкам:

2     p2      red       dalton
4     p4      blue      apex
2

Другие решения

Здесь мы используем explode, foreach а также array_values достичь желаемого результата.

Попробуйте этот фрагмент кода здесь

<?php

$filter = array(
0 => "color*black",
1 => "color*blue",
2 => "color*red",
3 => "paint*apex",
4 => "paint*dalton");

$result=array();
foreach($filter as $value)
{
list($before,$after)=explode("*",$value);
$result["before"][$before]=$before;
$result["after"][$after]=$after;
}
$result["before"]=  array_values($result["before"]);
$result["after"]=  array_values($result["after"]);
print_r($result);

Выход:

Array
(
[before] => Array
(
[0] => color
[1] => paint
)
[after] => Array
(
[0] => black
[1] => blue
[2] => red
[3] => apex
[4] => dalton
)
)
1

По вопросам рекламы [email protected]