2014-11-24 1 views
0

У меня есть этот массив, и я использую его в качестве ВХОД:декартово произведение ассоциативного массива показывает ключ и значение - 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_shift для array_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 
     ) 
    ... 
) 

Это не то, что я точно хочу. желаемая OUTPUT функции является:

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

Я думаю, что я получил его, я гугл «комбинации PHP» (при условии, что комбинация похожа на декартово произведение, я думаю, что это: s) и используются this code as a base. Изменение мне нужно сделать было вместо объединения массивов я должен был использовать союз, потому что в соответствии с инструкцией PHP:

значение во входном массиве с помощью цифровых клавиш будет перенумеровано с увеличивающимися ключами, начиная с нуля в массив результатов.

и

Если вы хотите добавить элементы массива из второго массива в первом массиве, а не перезаписывать элементы из первого массива, а не повторной индексации, используйте оператор накидной массив +. ... Клавиши из первого массива будут сохранены. Если в обоих массивах существует ключ массива, тогда будет использоваться элемент из первого массива, и элемент совпадающего ключа из второго массива будет проигнорирован.

КОД:

<?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) 
    } 
}