我會打入三個步驟此。
步驟一:改造這個
[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');
我在提問這樣的問題的經驗是,你應該在問題後提供問題的背景。這樣人們可以回答你的具體問題,並可能提出一個更好的方法來做事。 – andrew 2011-02-10 17:59:52