Лучший способ создать комбинацию каждого элемента с использованием PHP - PullRequest
0 голосов
/ 15 сентября 2018

Вот мой массив:

[options] => Array
    (
        [1] => Array
            (
                [0] => Red
                [1] => Yellow
                [2] => Blue
                [3] => Green
            )

        [2] => Array
            (
                [0] => 28
                [1] => 30
                [2] => 32
                [3] => 34
            )

        [3] => Array
            (
                [0] => Short Neck
                [1] => Full Neck
                [2] => Round Neck
            )

        [5] => Array
            (
                [0] => Bodycon
                [1] => Empire Waist
                [2] => High-Low
            )

    )

Хотите создать строку, подобную этой:
Красная-28-короткая шея-Bodycon
Красная-28-короткая шея-Империя-талия
Red-28-Short-High-Low-High

Red-28-Full Neck-Bodycon
Red-28-Full-Neck-Empire с талией
Red-28-Full Neck-High-Low-*

Красная-28-круглая шея-Bodycon
Красная-28-круглая шея-Империя-талия
Красная-28-круглая шея-Высокая-Низкая

Красная-30-короткая шея-Бодикон
Красная-30-короткая шея-Империя-талия
Красная-30-короткая шея-Хай-Лоу

Красная-30-полная шея-Bodycon
Красная-30-полная шея-Имперная талия
красная-30-полная шея-высокая-низкая

красная-30-круглая шея-Bodycon
красная-30-круглая шея-империя талия
красная-30-круглаяШея-High-Low

и т. Д. ...

Для каждого значения

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

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

function combine($arr) {
    if (count($arr) === 1) {
        return array_shift($arr);
    } 
    $items = array_shift($arr);

    $data = [];
    foreach ($items as $item) {
        foreach (combine($arr) as $value) {
            $data[] = $item . ' ' . $value;
        }
    } 
    return $data;
}

и используя пример:

$items = [
    [            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    [
        28,
        30,
        32,
        34
    ],
    [
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    [
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

$result = combine($items);
0 голосов
/ 15 сентября 2018

Для вашего массива:

$items = [
    1=>[            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    2=>[
        28,
        30,
        32,
        34
    ],
    3=>[
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    5=>[
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

Это самый простой и менее затратный способ его достижения

$items=array_values($items);
$result=[];


foreach($items[0] as $k1=>$v1){
    foreach($items[1] as $k2=>$v2){
        foreach($items[2] as $k3=>$v3){
            foreach($items[3] as $k4=>$v4){
                $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
            }
        }
    }   
}

Для вашего массива, если вы хотите удалить шаг из кода вышевы можете использовать вместо

$result=[];


    foreach($items[1] as $k1=>$v1){
        foreach($items[2] as $k2=>$v2){
            foreach($items[3] as $k3=>$v3){
                foreach($items[5] as $k4=>$v4){
                    $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
                }
            }
        }   
    }

Обратите внимание, что мы удаляем шаг array_values

. Эти коды выводят массив из 144 записей, представляющих все комбинации в ожидаемом порядке.

0 голосов
/ 15 сентября 2018

Вы можете использовать функцию cartesian () из потока в комментариях или простую подпрограмму, например:

$join = [];
foreach( $myarray[ 'options' ] as $block ) :

    foreach( $block as $i => $value ) :

        $join[ $i ][] = $value;

    endforeach;

endforeach;

foreach( $join as $string ) :

    echo implode( '-', $string ) . '<br>';

endforeach;

Выход:

Red-28-Short Neck-Bodycon
Yellow-30-Full Neck-Empire Waist
Blue-32-Round Neck-High-Low
Green-34

Не очень красиво, но нужно выполнить работу для одного варианта использования.

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