SQLのGROUP BYの様な処理を配列に行う
public function array_group_by($arr,$keys = array(array('id','address'),array('name') ),$index = 0)
{
if(empty($arr))
return null;
$results = array();
$children = array();
$_vkey = $keys[$index][0];
$_keys = array_slice($keys,0,$index+1);
$is_final = count($keys) <= $index + 1;
$id = null;
array_push($arr,null);
foreach ($arr as $i => $data){
$current_id = $this->get_values_by_keys($data,$_keys,'');
if($id != $current_id){
if(!is_null($id)) {
if(!empty($children)) {
$tmp = $this->get_std_by_array($children[0], $keys[$index]);
$tmp->value = $children[0]->$_vkey;
}else{
$tmp = new stdClass();
}
$tmp->children = $is_final ? $children : $this->array_group_by($children,$keys,$index+1);
$results[] = $tmp;
$children = array();
}
$id = $current_id;
}
$children[] = $data;
}
return $results;
}
public function get_std_by_array($arr,$include_keys = null)
{
$tmp = new stdClass();
foreach ($arr as $key => $v){
if(empty($include_keys) || (!empty($include_keys) && in_array($key,$include_keys)))
$tmp->$key = $v;
}
return $tmp;
}
public function get_values_by_keys($data,$keys,$glue = null)
{
if(empty($data))
return null;
$tmp = array();
foreach ($keys as $key){
if(is_array($key))
$key = array_shift(array_values($key));
$tmp[] = $data->$key;
}
return is_null($glue) ? $tmp : implode($glue,$tmp);
}