2014-11-24 5 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_pop에 대한 array_shift 전환) :

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

내가 정확히 원하는 것은 아닙니다. 함수의 원하는 출력은 다음과 같습니다

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

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

    [1] => Array 
     (
      [11131] => 2.720 
      [11129] => 2.920 
      [11130] => 3.895 
     ) 
    ... 
) 
내가 필요처럼 내 새로운 배열의 첫 번째 요소를 만드는 방법에 함께했다

는 코드의 일부는 다음과 같습니다

하지만 그게 내가 붙어있어. 다른 값을 가져 와서 키를 잡고 키로 표시 할 수 없습니다. 내가 얻을 수 있었던 최종 배열은 이것처럼 보인다. 및 this code as a base을 사용 :

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 조합"인터넷 검색, 내가 찾은 것 같아 (의 조합이 직교 제품 비슷하다고 가정을, 나는 그것이라고 생각합니다). 필자가 필요했던 변경은 php 매뉴얼에 따라 union을 사용해야했던 배열을 병합하는 것이 아니 었습니다.

숫자 키가있는 입력 배열의 값은 0부터 시작하여 숫자가 증가하는 번호로 다시 매겨집니다. 결과 배열.

첫 번째 배열 요소를 덮어 쓰기하지 않으면 서 첫 번째 배열에 제 2 어레이의 배열 요소를 추가하지 재 색인은 + 어레이 조합 연산자를 사용하려면

. ... 첫 번째 배열의 키가 보존됩니다. 두 배열에 배열 키가 있으면 첫 번째 배열의 요소가 사용되고 두 번째 배열의 일치하는 키 요소는 무시됩니다.

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