декартово произведение — лучший способ создать комбинацию каждого элемента, используя переполнение стека

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

[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-короткая шея
Красный-28-Короткая шея-Хай-Лоу

Red-28-Full Neck-Bodycon
Red-28-полный шеи-империи талии
Red-28-Full-Neck-High-Low

Red-28-шею-Bodycon
Красная 28-круглая шея-империя талии
Red-28-шею-хай-хай-лоу

Красный-30-короткий шеи-Bodycon
Red-30-шея-империя талии
Красный-30-короткий шею-хай-лоу

Red-30-Full Neck-Bodycon
Red-30-полный шеи-империи талии
Red-30-Full-Neck-High-Low

Red-30-шею-Bodycon
Красная шея с круглым вырезом
Red-30-шею-шею-Хай-Лоу

и так далее…

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

Спасибо

1

Решение

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

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);
1

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

Вы можете использовать функцию 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

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

0

Учитывая ваш массив:

$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
По вопросам рекламы [email protected]