Получить все перестановки из нескольких массивов Переполнение стека

У меня есть следующий массив

Array
(
['colour'] => Array
(
[0] => 1130
[1] => 1131
[2] => 1132
[3] => 1133
)

['size'] => Array
(
[0] => 1069
[1] => 1070
)
//there could also be further arrays here such as weight etc

)

Я хочу получить все возможные перестановки — такие как

 Colour 1130 - Size 1069
Colour 1130 - Size 1070
Colour 1131 - Size 1069
Colour 1131 - Size 1070
Colour 1132 - Size 1069
etc

Но, очевидно, не хотят иметь перестановки, которые содержат более 1 каждого типа (элемент не может быть как синим и красным, так и большим и средним)

обратите внимание, что все клавиши цифровые, я изменил их здесь на цвет, размер, чтобы сделать его более понятным (надеюсь!)

0

Решение

Я взял декартову функцию от этот ответ, и учитывая результат, который вы хотели.

(Кредит Sergiy для создания функции)

https://eval.in/199787

<?php

$array = Array
(
'colour' => Array
(
1130,
1131,
1132,
1133
),
'size' => Array
(
1069,
1070
)
);

echo "<pre>";
$arrFinalArray = cartesian($array);
foreach( $arrFinalArray as $arrIndie) {
//We know each as 2 keys
$arrKeys = array_keys($arrIndie);
$arrValues = array_values($arrIndie);

echo $arrKeys[0] ."  ". $arrValues[0] ." - ". $arrKeys[1] ." ". $arrValues[1] ."<br />";
}
echo "</pre>";function cartesian($input) {
// filter out empty values
$input = array_filter($input);

$result = array(array());

foreach ($input as $key => $values) {
$append = array();

foreach($result as $product) {
foreach($values as $item) {
$product[$key] = $item;
$append[] = $product;
}
}

$result = $append;
}

return $result;
}
0

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

$col = array('color'=>array(1130,1131,1132,1133));
$size = array('size'=>array(1069,1070));
$new_col = array();
foreach($col['color'] as $i=>$c){
$new_col[]= "Color ". $c;
}

$new_size = array();
foreach($size['size'] as $i=>$s){
$new_size[]= "Size ". $s;
}

$new_array = array();

foreach($new_col as $nc){

foreach($new_size as $ns){
$new_array[] = $nc. " ".$ns;
}
}
print_r($new_array);
0

По вопросам рекламы [email protected]