2016-01-20 106 views
0

所以,我有三個數組:合併三個陣列在PHP

$ foo的

Array 
(
    [0] => Array 
     (
      [sum] => 281 
      [status] => 0 
     ) 

    [1] => Array 
     (
      [sum] => 1534 
      [status] => 1 
     ) 

    [2] => Array 
     (
      [sum] => 1434 
      [status] => 2 
     ) 

    [3] => Array 
     (
      [sum] => 2468 
      [status] => 3 
     ) 

) 

$巖

Array 
    (
     [0] => Array 
      (
       [sum] => 514 
       [status] => 0 
      ) 

     [1] => Array 
      (
       [sum] => 500 
       [status] => 1 
      ) 

    ) 

$酒吧

Array 
(
    [0] => Array 
     (
      [sum] => 458 
      [status] => 0 
     ) 

    [1] => Array 
     (
      [sum] => 500 
      [status] => 1 
     ) 

) 

我需要合併與$bar$rock$foo,使得關鍵總和被添加。

例如: 上合併$bar$rock$foo,第一個索引,其中status爲0會是這個樣子:

[0] => Array 
    (
     [sum] => 1253 (281 + 514 + 458) 
     [status] => 0 
    ) 

和合並應該發生的基礎上,statusstatus 0從$rock將合併

我就在想,如果這是一個遞歸的應用程序,使事情更加複雜。

我應該如何以簡單和優化的方式解決問題?

+0

嘗試把它們變成一個單一的陣列['array_merge'](http://php.net/manual/en/function.array -merge.php),然後將整個事件作爲一個數組處理。 – samlev

+0

狀態是否總是等於數組鍵/索引? – Scott

+0

@Scott否,狀態將不等於鍵/索引。 – nirvair

回答

1

我總是對將來可以使用的一般使用功能的愛好者。這種解決方案有三個參數:

1)需要組合

2),其將被用作比較的基礎(即有鑰匙將被合併的兩個節點密鑰的所有數組的數組)

3)中的數據密鑰,這將是如果節點是「等於」

最後,PHP是在製作的字典/包含HashMap非常好,其結合領域。這將有助於我們組合陣列,因爲我們不必進行太多搜索。

/** 
* $arrays - an array of arrays to be combined 
* $key - a key in the array that represents the key that holds the values that need to be compared 
* $data - a key in the array that represens the key that holds the data 
*/ 
function combine($arrays, $key, $data) { 
$ans = array(); 

//Go through each array that needs to be combined 
foreach($arrays as $nodes) { 
    //go through each node of the array 
    foreach($nodes as $node) { 
     //make sure the node actually has the key we need 
     if (isset($node[$key])) { 
      //initialize the answer to a new node(array with key, data) 
      $ansKey = $node[$key]; 
      if (!isset($ans[$node[$key]])) { 
       $ans[$ansKey] = array(); 
       $ans[$ansKey][$key] = $node[$key]; 
       $ans[$ansKey][$data] = 0; 
      } 
      //make sure the node actually has the data we need 
      if (isset($node[$data])) { 
       //combined the data 
       $ans[$ansKey][$data] += $node[$data]; 
      } 
     } 
    } 
} 
//we only care about the nodes, not the ansKeys we used to get there 
return array_values($ans); 
} 

在你的榜樣,你會打電話combine(array($rock, $foo, $bar), "status", "sum")

這個功能應該是O(n)其中n是節點的數量。每個節點只處理一次,因爲php數組有一個O(1)的查找,我們沒有時間搜索以前的值,因爲所有的查找都是在數組索引上完成的,而不是數組值。

當我與您的數據運行的功能,它返回 -

Array 
(
[0] => Array 
    (
     [status] => 0 
     [sum] => 1253 
    ) 

[1] => Array 
    (
     [status] => 1 
     [sum] => 2534 
    ) 

[2] => Array 
    (
     [status] => 2 
     [sum] => 1434 
    ) 

[3] => Array 
    (
     [status] => 3 
     [sum] => 2468 
    ) 

) 
+0

這個工程。謝謝。 – nirvair

+0

@RyanVincent - 我在結果中添加了(我確實有一個小的語法錯誤,我也修正了)。 – Scott

+0

因此,我們不能將第一個參數作爲「n」個數組,而是先將它們合併,然後在單個循環中進行比較? – nirvair