2014-11-24 121 views
0

我有這樣的陣列,我用它作爲INPUT笛卡爾積 - PHP

Array 
(
    [0] => Array 
     (
      [11134] => 3.430 
      [11131] => 2.720 
      [11128] => 1.077 
     ) 

    [1] => Array 
     (
      [11135] => 2.381 
      [11132] => 2.636 
      [11129] => 2.920 
     ) 

    [2] => Array 
     (
      [11136] => 1.220 
      [11133] => 2.550 
      [11130] => 3.895 
     ) 

) 

我需要打印該數組的笛卡爾乘積。我使用了位於here的答案,但它對我毫無幫助。我已經修改了喬恩發佈,使其更快的功能(實際上只是交換array_shiftarray_pop所以它不會重新索引數組作爲數字):

function cartesian($input) { 
    $result = array(); 

    while (list($key, $values) = each($input)) { 
     if (empty($values)) { 
      continue; 
     } 

     if (empty($result)) { 
      foreach($values as $value) { 
       $result[] = array($key => $value); 
      } 
     } 
     else { 

      $append = array(); 

      foreach($result as &$product) { 
       $product[$key] = array_pop($values); 

       $copy = $product; 

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

       $values[] = $product[$key]; 
      } 

      $result = array_merge($result, $append); 
     } 
    } 

    return $result; 
} 

給出打印以下數組答案:

Array 
(
    [0] => Array 
     (
      [0] => 3.430 
      [1] => 2.920 
      [2] => 3.895 
     ) 

    [1] => Array 
     (
      [0] => 2.720 
      [1] => 2.920 
      [2] => 3.895 
     ) 
    ... 
) 

這不是我真正想要的。 功能所需的輸出是:

Array 
(
    [0] => Array 
     (
      [11134] => 3.430 
      [11129] => 2.920 
      [11130] => 3.895 
     ) 

    [1] => Array 
     (
      [11131] => 2.720 
      [11129] => 2.920 
      [11130] => 3.895 
     ) 
    ... 
) 

我想出瞭如何使我的新數組的第一個元素看起來像我需要的部分代碼如下:

if (empty($result)) { 
    foreach($values as $key => $value) { 
     $result[] = array($key => $value); 
    } 
} 

但這就是我卡住的地方。我無法獲得其他值來獲取它們的鍵並顯示爲鍵。我設法得到的最後一個數組看起來像這樣。

Array 
(
    [0] => Array 
     (
      [11134] => 3.430 
      [1] => 2.920 
      [2] => 3.895 
     ) 

    [1] => Array 
     (
      [11131] => 2.720 
      [1] => 2.920 
      [2] => 3.895 
     ) 
    ... 
) 

回答

1

我想我得到了它,我用Google搜索「PHP組合」(假設組合類似於笛卡爾乘積,我認爲是:S)和使用this code as a base。我需要作出改變是代替合併陣列我不得不使用聯合因爲根據php手冊:用數字鍵輸入數組中

值將隨遞增密鑰從零起始重新編號結果數組。

如果你想從第二個數組的數組元素添加到第一陣列,而不是覆蓋從第一數組中的元素,而不是重新索引,使用+陣列union運算符。 ...第一個數組中的鍵將被保留。如果在兩個數組中都存在數組鍵,則將使用第一個數組中的元素,並忽略第二個數組中的匹配鍵元素。

CODE:

<?php 
$temp = Array 
(
    "0" => Array 
     (
      "11134" => 3.430, 
      "11131" => 2.720, 
      "11128" => 1.077 
     ), 

    "1" => Array 
     (
      "11135" => 2.381, 
      "11132" => 2.636, 
      "11129" => 2.920 
     ), 

    "2" => Array 
     (
      "11136" => 1.220, 
      "11133" => 2.550, 
      "11130" => 3.895 
     ) 

); 


function get_combinations($arrays) { 
    $result = array(array()); 
    foreach ($arrays as $property => $property_values) { 
     $tmp = array(); 
     foreach ($result as $result_item) { 
      foreach ($property_values as $property_key => $property_value) { 
       $tmp[] = $result_item + array($property_key => $property_value); 
      } 
     } 
     $result = $tmp; 
    } 
    return $result; 
} 

$combinations = get_combinations($temp); 

var_dump($combinations); 
?> 

結果:

array(27) { 
    [0]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11135]=> 
    float(2.381) 
    [11136]=> 
    float(1.22) 
    } 
    [1]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11135]=> 
    float(2.381) 
    [11133]=> 
    float(2.55) 
    } 
    [2]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11135]=> 
    float(2.381) 
    [11130]=> 
    float(3.895) 
    } 
    [3]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11132]=> 
    float(2.636) 
    [11136]=> 
    float(1.22) 
    } 
    [4]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11132]=> 
    float(2.636) 
    [11133]=> 
    float(2.55) 
    } 
    [5]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11132]=> 
    float(2.636) 
    [11130]=> 
    float(3.895) 
    } 
    [6]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11129]=> 
    float(2.92) 
    [11136]=> 
    float(1.22) 
    } 
    [7]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11129]=> 
    float(2.92) 
    [11133]=> 
    float(2.55) 
    } 
    [8]=> 
    array(3) { 
    [11134]=> 
    float(3.43) 
    [11129]=> 
    float(2.92) 
    [11130]=> 
    float(3.895) 
    } 
    [9]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11135]=> 
    float(2.381) 
    [11136]=> 
    float(1.22) 
    } 
    [10]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11135]=> 
    float(2.381) 
    [11133]=> 
    float(2.55) 
    } 
    [11]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11135]=> 
    float(2.381) 
    [11130]=> 
    float(3.895) 
    } 
    [12]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11132]=> 
    float(2.636) 
    [11136]=> 
    float(1.22) 
    } 
    [13]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11132]=> 
    float(2.636) 
    [11133]=> 
    float(2.55) 
    } 
    [14]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11132]=> 
    float(2.636) 
    [11130]=> 
    float(3.895) 
    } 
    [15]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11129]=> 
    float(2.92) 
    [11136]=> 
    float(1.22) 
    } 
    [16]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11129]=> 
    float(2.92) 
    [11133]=> 
    float(2.55) 
    } 
    [17]=> 
    array(3) { 
    [11131]=> 
    float(2.72) 
    [11129]=> 
    float(2.92) 
    [11130]=> 
    float(3.895) 
    } 
    [18]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11135]=> 
    float(2.381) 
    [11136]=> 
    float(1.22) 
    } 
    [19]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11135]=> 
    float(2.381) 
    [11133]=> 
    float(2.55) 
    } 
    [20]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11135]=> 
    float(2.381) 
    [11130]=> 
    float(3.895) 
    } 
    [21]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11132]=> 
    float(2.636) 
    [11136]=> 
    float(1.22) 
    } 
    [22]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11132]=> 
    float(2.636) 
    [11133]=> 
    float(2.55) 
    } 
    [23]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11132]=> 
    float(2.636) 
    [11130]=> 
    float(3.895) 
    } 
    [24]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11129]=> 
    float(2.92) 
    [11136]=> 
    float(1.22) 
    } 
    [25]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11129]=> 
    float(2.92) 
    [11133]=> 
    float(2.55) 
    } 
    [26]=> 
    array(3) { 
    [11128]=> 
    float(1.077) 
    [11129]=> 
    float(2.92) 
    [11130]=> 
    float(3.895) 
    } 
}