Мне нужно создать предложение sql из динамической структуры. Структура исходит из многомерного массива. Объяснить сложнее, чем показать, поэтому показываю 3 примера:
Пример 1: если у меня есть этот массив:
myarry Array
(
[5] => Array
(
[0] => 2
[1] => 5
)
[6] => Array
(
[0] => 11
)
)
Мне нужно создать строку вида: (2 И 11) ИЛИ (5 И 11)
Пример 2: если у меня есть этот массив:
myarry Array
(
[5] => Array
(
[0] => 2
[1] => 5
)
[6] => Array
(
[0] => 11
[1] => 8
)
)
Мне нужно создать строку вида: (2 И 11) ИЛИ (5 И 11) ИЛИ (2 И 8) ИЛИ (5 И 8)
Пример 3: если у меня есть этот массив:
myarry Array
(
[5] => Array
(
[0] => 2
[1] => 5
)
[6] => Array
(
[0] => 11
)
[7] => Array
(
[0] => 70
[1] => 71
[2] => 72
)
)
Мне нужно создать строку вида: (2 И 11 И 70) ИЛИ (2 И 11 И 71) ИЛИ (2 И 11 И 72) ИЛИ (5 И 11 И 70) ИЛИ (5 И 11 И 71) ИЛИ (5 И 11 И 72)
И так далее... Индекс в массиве не важен.
Я уже пробовал:
foreach ($myarry as $clave => $feature){
${"feat_$n"} = $feature;
$n++;
}
$quan= count($myarry);
foreach ($feat_0 as $feature1) {
for ($m = 1; $m < $quan; $m++){
$name = "feat_{$m}";
foreach ($$name as $feature2) {
echo "OR feature1: ".$feature1." AND feature2: ".$feature2."<br>";
}
}
}
А также:
foreach ($myarry as $clave => $feature){
${"feat_$n"} = $feature;
$n++;
}
$i = 0;
foreach ($feat_0 as $clave0 => $feature0) {
for ($m = 1; $m < $cantidad; $m++){
$name = "feat_{$m}";
foreach ($$name as $clave1 => $feature1) {
echo "-feature0: ".$feature0." - feature1: ".$feature1." - i: ".$i." - m: ".$m."<br>";
$i++;
if ($m == 1)
$indice = $feature1;
else
$pena[$feature0][$indice][$i] = $feature1;
}
$i=0;
}
}
Но я даже не близок к решению :( Надеюсь вопрос ясен. Любая помощь будет приветствоваться!
StackOverflow не является бесплатной службой кодирования. Обновите свой вопрос, чтобы показать, что вы уже пробовали в минимальный воспроизводимый пример. Для получения дополнительной информации см. Как спросить и возьмите тур :)
По сути, вам нужна вся комбинация — сначала попробуйте сделать это, а затем используйте implode
, чтобы создать фактический запрос.
Да, извините, я не поставил свой код раньше, потому что я даже не близко... Но я собираюсь обновить свой вопрос. Я думаю, что implode не работает, потому что все элементы находятся между собой.
Вот очень простое решение этой проблемы: stackoverflow.com/a/44910370/2685833
Вот пользовательская функция из источник с некоторыми изменениями:
Сначала я создал уникальные комбинации всех элементов массива, такие как набор, а затем сопоставил их, чтобы создать нужную строку.
function custom_function($myarry)
{
if (count($myarry) == 0) {
return array();
}
$a = array_shift($myarry);
if (count($myarry) == 0) {
$c = array(array());
} else {
$c = custom_function($myarry); // recursive call
}
$r = array();
foreach ($a as $v) {
foreach ($c as $p) {
$r[] = array_merge(array($v), $p);
}
}
return $r;
}
$temp = custom_function($myarry);
$andArr = [];
array_walk($temp, function ($item, $key) use (&$andArr) {
$andArr[] = '(' . implode(" AND ", $item) . ') ';
});
$str = implode(' OR ', $andArr);
array_walk — применить предоставленную пользователем функцию к каждому члену массива
array_shift — Сдвинуть элемент с начала массива
Демо.
Спасибо Рахул! Это работает как шарм! Ты великолепен!
Используйте
implode(' AND ')
для создания внутренних строк иimplode(' OR ')
для создания внешних строк.