2014-09-29 2 views
0

У меня есть следующий массивПолучить все перестановки из нескольких массивов PHP

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 каждого типа (элемент не может быть как синим, так и красным или большим и средним)

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

+1

возможно дубликат [Поиск декартово произведение с PHP ассоциативные массивы] (http://stackoverflow.com/ вопросы/6311779/find-cartesian-product-with-php-ассоциативные массивы) – georg

ответ

0

Я взял декартовую функцию от this answer и дал желаемый результат.

(Кредит 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

Спасибо! это именно то, что я искал – Buzzmonkey

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