Многомерный массив PHP со всеми элементами

Мне нужно создать предложение 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;
        }
    }

Но я даже не близок к решению :( Надеюсь вопрос ясен. Любая помощь будет приветствоваться!

Используйте implode(' AND ') для создания внутренних строк и implode(' OR ') для создания внешних строк.

Barmar 10.04.2019 14:02

StackOverflow не является бесплатной службой кодирования. Обновите свой вопрос, чтобы показать, что вы уже пробовали в минимальный воспроизводимый пример. Для получения дополнительной информации см. Как спросить и возьмите тур :)

Barmar 10.04.2019 14:02

По сути, вам нужна вся комбинация — сначала попробуйте сделать это, а затем используйте implode, чтобы создать фактический запрос.

dWinder 10.04.2019 14:09

Да, извините, я не поставил свой код раньше, потому что я даже не близко... Но я собираюсь обновить свой вопрос. Я думаю, что implode не работает, потому что все элементы находятся между собой.

Valle 10.04.2019 14:51

Вот очень простое решение этой проблемы: stackoverflow.com/a/44910370/2685833

whyguy 10.04.2019 16:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пользовательская функция из источник с некоторыми изменениями:

Сначала я создал уникальные комбинации всех элементов массива, такие как набор, а затем сопоставил их, чтобы создать нужную строку.

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 — Сдвинуть элемент с начала массива

Демо.

Спасибо Рахул! Это работает как шарм! Ты великолепен!

Valle 10.04.2019 15:09

Другие вопросы по теме