2011-02-10 145 views
0

我有一個大的多維數組,結構如下面的示例。PHP - 合併多維數組中的鍵

[0] => Array 
    (
     [name] => SMITH 
     [status] => Incomplete 
     [count] => 2 
    ) 

[1] => Array 
    (
     [name] => SMITH 
     [status] => Complete 
     [count] => 2 
    ) 

[2] => Array 
    (
     [name] => HUGHES 
     [status] => Incomplete 
     [count] => 3 
    ) 

[3] => Array 
    (
     [name] => HUGHES 
     [status] => Complete 
     [count] => 1 
    ) 

我想什麼是新的陣列看起來像這樣 -

[0] => Array 
    (
     [name] => SMITH 
     [Complete] => 2 
     [Incomplete] => 2 
    ) 

[1] => Array 
    (
     [name] => HUGHES 
     [Complete] => 1 
     [Incomplete] => 3 
    ) 

我是很新,PHP,我也意識到我需要遍歷原始數組,但任何幫助將不勝感激。

+1

我在提問這樣​​的問題的經驗是,你應該在問題後提供問題的背景。這樣人們可以回答你的具體問題,並可能提出一個更好的方法來做事。 – andrew 2011-02-10 17:59:52

回答

2
$original = array(array ('name' => 'SMITH', 
          'status' => 'Incomplete', 
          'count' => 2 
         ), 
        array ('name' => 'SMITH', 
          'status' => 'Complete', 
          'count' => 2 
         ), 

        array ('name' => 'HUGHES', 
          'status' => 'Incomplete', 
          'count' => 3 
         ), 
        array ('name' => 'HUGHES', 
          'status' => 'Complete', 
          'count' => 1 
         ), 
       ); 

// initialise our new array 
$newArray = array(); 
// loop through each entry from the original array in turn 
foreach($original as $entry) { 
    // temporarily use the name as the key for our new array (we'll reset to a numeric later) 
    $name = $entry['name']; 
    $newArray[$name]['name'] = $name; 
    // test if we have multiple entries for the same name/status 
    if (isset($newArray[$name][$entry['status']])) { 
     $newArray[$name][$entry['status']] += $entry['count']; 
    } else { 
     $newArray[$name][$entry['status']] = $entry['count']; 
    } 
} 

// Reset top-level keys to numerics 
$newArray = array_values($newArray); 

echo '<pre>'; 
var_dump($newArray); 
echo '</pre>'; 
+0

我會反轉您的`isset`檢查,以便您可以刪除else語句,將`status`的值設置爲'0',然後使用`+ =`運算符將代碼減少2行。 – RobertPitt 2011-02-10 17:59:52

+0

看起來不錯....感謝您的快速響應 – Seeds 2011-02-10 18:09:42

0

像這樣將是方式我會去:使用上述陣列樣品

$new = array(); 
foreach($original as $entity) 
{ 
    if(!isset($new[$entity["name"]])) 
    { 
     $new[$entity["name"]] = array(
      "name" => $entity["name"], 
      "Complete" => 0, 
      "Incomplete" => 0 
     ); 
    } 
    $new[$entity["name"]][$entity["status"]] += $entity["count"]; 
} 

print_r($new); 

,請注意在陣列的情況下,靈敏度,這具有的效果。

的outpout會像這樣:

Array 
(
    [SMITH] => Array 
     (
      [name] => SMITH 
      [Complete] => 2 
      [Incomplete] => 2 
     ) 

    [HUGHES] => Array 
     (
      [name] => HUGHES 
      [Complete] => 1 
      [Incomplete] => 3 
     ) 

) 

,並有現場演示代碼@http://codepad.org/H099lulS

2

我會打入三個步驟此。

步驟一:改造這個

[0] => Array 
    (
     [name] => SMITH 
     [status] => Incomplete 
     [count] => 2 
    ) 

[1] => Array 
    (
     [name] => SMITH 
     [status] => Complete 
     [count] => 2 
    ) 

這個

[0] => Array 
    (
     [name] => SMITH 
     [Incomplete] => 2 
    ) 

[1] => Array 
    (
     [name] => SMITH 
     [Complete] => 2 
    ) 

可以通過以下

$data = array_map($data, function($d) { 
    return array('name' => $d['name'], $d['status'] => $d['count']); 
}); 

第二步要做:

我見過很多人們問阿博處理這個問題的階段,通常在處理數據庫查詢結果集時。基本問題是,不是按行號對記錄進行索引,而是基於每條記錄包含的某些數據對記錄進行索引。

:所以,這是一個泛型函數...作用

function make_index($array, $key) { 
    foreach ($array as $a) { 
     $r = &$reindexed[$a[$key]]; 
     $r = array_merge((array)$r, $a); 
    } 
    return $reindexed; 
} 

我們的結果從步驟一,假設我們稱其爲$data = make_index($data, "name");,我們將在

Array 
(
    [SMITH] => Array 
     (
      [name] => SMITH 
      [Incomplete] => 2 
      [Complete] => 2 
     ) 

) 

第三步到達現在你想回到數字指標,這很容易實現。

$data = array_values($data); 

Array 
(
    [0] => Array 
     (
      [name] => SMITH 
      [Incomplete] => 2 
      [Complete] => 2 
     ) 

) 

結論:

它打破數據集變換成嬰兒的步驟是非常有用的。通過這樣做,您可以在不同問題中重複使用各個步驟。而且,對於複雜的更改,一旦寫入代碼,就可以更容易地獲得解決方案或理解代碼。

約第二步A注:

在兩個步驟我提供了一個「通用」的功能,但實際上,通過array_merge完成合並不會滿足大多數情況。具體而言,查詢結果包含所有相同鍵的記錄,簡單覆蓋不可能是所需的聚合方法。這是克服這個限制的另一個變體。

function make_index($array, $key, $M) { 
    foreach ($array as $a) { 
     $r = &$reindexed[$a[$key]]; 
     $r = $M((array)$r, $a); 
    } 
    return $reindexed; 
} 

// ex: $data = make_index($data, "name", function($e1, $e2){ 
// return array_merge($e1, $e2); 
// }); 
// equiv to: $data = make_index($data, "name", 'array_merge');