2 D配列グループ化アルゴリズム


問題の説明
配列Aは2次元配列であり、groupキーはパケットキーと見なすことができる.
//  A
$data = array(
	
	array('name'=>'name1','id'=>1,'age'=>'18','group'=>'a'),
	array('name'=>'name2','id'=>2,'age'=>'19','group'=>'b'),
	array('name'=>'name3','id'=>3,'age'=>'10','group'=>'a'),
	array('name'=>'name4','id'=>4,'age'=>'17','group'=>'c'),
);

パケットキーに従って変換すると,配列Bのようなデータ構造が得られることが望ましい.
//  B
$result = array(
	
	'a'=>array(
		array('name'=>'name1','id'=>1,'age'=>'18','group'=>'a'),
		array('name'=>'name3','id'=>3,'age'=>'10','group'=>'a'),
	),
	'b'=>array(
		array('name'=>'name2','id'=>2,'age'=>'19','group'=>'b'),
	),
	'c'=>array(
		array('name'=>'name4','id'=>4,'age'=>'17','group'=>'c'),
	)
);


アルゴリズムの考え方
元の配列をトランプと見なすことができ、その中の色はグループキーとして使われています.最初のカードから、新しい色が現れるたびにキューを個別に設定します.そうしないと、現在の色キューに追加されます.これにより、1回の遍歴でグループ化が完了します.
$groupdata = arr_group($data,'group');//    B


function arr_group($data,$groupkey){
	
	$result = array();
	foreach($data as $vo){
		
		$name = $vo[$groupkey];
		
		if(!isset($result[$name])){
			
			$result[$name] = array();			
		}
		
		$result[$name][]= $vo;	
	}
	return $result;
}