PHP массив многомерный, пересекающий все элементы - PullRequest
1 голос
/ 10 апреля 2019

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

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

1 Ответ

3 голосов
/ 10 апреля 2019

Вот пользовательская функция из source с некоторой модификацией,

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

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

Демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...