2017-10-10 69 views
0

我有多個結果從MySQL陣列這樣PHP合併用相同的鍵陣列的一個自定義的陣列

數組1

Array 
(
    [type] => Food 
    [storage] => S5213 
    [quantity1] => 1000 
    [in1] => 10/09/2017 
    [quantity2] => 1000 
    [in2] => 10/09/2017 
) 

陣列2

Array 
(
    [type] => Food 
    [storage] => S4512 
    [quantity1] => 990 
    [in1] => 13/09/2017 

) 

陣列3

Array 
(
    [type] => Drink 
    [storage] => K4221 
    [quantity1] => 12000 
    [in1] => 12/09/2017 
) 

所以,我會喜歡如果來自不同數組的「類型」這樣的密鑰相同並將其放入自定義數組中,則合併。同時,對於不同的股票數量和日期,它可能有數量1,數量2,數量3和in1,in2,in3。想合併成「機架」。

預期的結果

Array 
(
[Food] => Array 
    (
     [0] => Array 
      (
       [storage] => S5213 
       [rack] => Array 
        (
         [0] => Array 
          (
           [quantity] => 1000 
           [in] => 10/09/2017 
          ) 

         [1] => Array 
          (
           [quantity] => 1000 
           [in] => 10/09/2017 
          ) 

        ) 

      ) 

     [1] => Array 
      (
       [storage] => S4512 
       [rack] => Array 
        (
         [0] => Array 
          (
           [quantity] => 990 
           [in] => 13/09/2017 
          ) 

        ) 

      ) 

    ) 

[Drink] => Array 
    (
     [0] => Array 
      (
       [storage] => K4221 
       [rack] => Array 
        (
         [0] => Array 
          (
           [quantity] => 12000 
           [in] => 12/09/2017 
          ) 

        ) 

      ) 

    ) 

) 

這可能嗎?嘗試使用array_merge_recursive,但不輸出預期的結果。

+0

請顯示您嘗試過的以及它生成的內容。 – ADyson

+1

另外我注意到你說數組來自mysql。如果你在表中有類似quantity1,quantity2等字段,那麼看起來你的第一份工作可能是在你繼續之前正確地規範你的表結構。 – ADyson

回答

1

如果這是您的SQL查詢返回的內容,那麼它看起來像您的數據庫未規範化。更具體地說,你不應該在單個表中有列quantity1quantity2,...等。規則是,如果您有多個字段,請創建一個單獨的表。在這種情況下,該表應該只有一個外鍵,也許是一個序號(1,2,...),最後是一個quantity列。多個數量將在該附加表格中表示爲多行。 in字段可以添加到,因爲它似乎遵循相同的規則。

無論如何,對於給定的情況下,你可以使用這個PHP函數:

function addArray(&$main, $arr) { 
    if (!is_array($main)) $main = []; // first time 
    $main[$arr["type"]][] = [ 
     "storage" => $arr["storage"], 
     "rack" => array_reduce(array_keys($arr), function ($acc, $key) use ($arr) { 
      if (strpos($key, "quantity") === 0) { 
       $acc[] = [ 
        "quantity" => $arr[$key], 
        "in" => $arr[str_replace("quantity", "in", $key)] 
       ]; 
      } 
      return $acc; 
     }, []) 
    ]; 
} 

如下使用它:

$arr = [ 
    "type" => "Food", 
    "storage" => "S5213", 
    "quantity1" => 1000, 
    "in1" => "10/09/2017", 
    "quantity2" => 1000, 
    "in2" => "10/09/2017" 
]; 
addArray($main, $arr); 

$arr = [ 
    "type" => "Food", 
    "storage" => "S4512", 
    "quantity1" => 990, 
    "in1" => "13/09/2017" 
]; 
addArray($main, $arr); 

$arr = [ 
    "type" => "Drink", 
    "storage" => "K4221", 
    "quantity1" => 12000, 
    "in1" => "12/09/2017" 
]; 
addArray($main, $arr); 

...等$main具有所需的結構。

+0

感謝您的建議。我現在要改變桌子。非常感謝您的幫助。 – JeromeWang