Групповой массив по значениям субарама

Вот интересная задача. У меня есть массив подмассивов в следующем формате:

array ( a => array ( id = 20, name = chimpanzee ) b => array ( id = 40, name = meeting ) c => array ( id = 20, name = dynasty ) d => array ( id = 50, name = chocolate ) e => array ( id = 10, name = bananas ) f => array ( id = 50, name = fantasy ) g => array ( id = 50, name = football ) ) 

И я хотел бы сгруппировать его в новый массив, основанный на поле id в каждом подмассиве.

 array ( 10 => array ( e => array ( id = 10, name = bananas ) ) 20 => array ( a => array ( id = 20, name = chimpanzee ) c => array ( id = 20, name = dynasty ) ) 40 => array ( b => array ( id = 40, name = meeting ) ) 50 => array ( d => array ( id = 50, name = chocolate ) f => array ( id = 50, name = fantasy ) g => array ( id = 50, name = football ) ) ) 

Благодаря!

 $arr = array(); foreach($old_arr as $key => $item) { $arr[$item['id']][$key] = $item; } ksort($arr, SORT_NUMERIC); 
 foreach($array as $key => $value){ $newarray[$value['id']][$key] = $value; } var_dump($newarray); 

Кусок пирога 😉

Следующий код адаптирует код @Tim Cooper для уменьшения ошибок Undefined index: id в случае, если один из внутренних массивов не содержит идентификатор :

 $arr = array(); foreach($old_arr as $key => $item) { if(array_key_exists('id', $item)) $arr[$item['id']][$key] = $item; } ksort($arr, SORT_NUMERIC); 

Однако он потеряет внутренние массивы без id.

Например

 $old_arr = array( 'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ), 'b' => array ( 'id' => 40, 'name' => 'meeting' ), 'c' => array ( 'id' => 20, 'name' => 'dynasty' ), 'd' => array ( 'id' => 50, 'name' => 'chocolate' ), 'e' => array ( 'id' => 10, 'name' => 'bananas' ), 'f' => array ( 'id' => 50, 'name' => 'fantasy' ), 'g' => array ( 'id' => 50, 'name' => 'football' ), 'h' => array ( 'name' => 'bob' ) ); 

полностью отбросит массив «h».

Вы также можете использовать Arrays :: gorupBy form ouzo-goodies :

 $groupBy = Arrays::groupBy($array, Functions::extract()->id); print_r($groupBy); 

И результат:

 Array ( [20] => Array ( [0] => Array ( [id] => 20 [name] => chimpanzee ) [1] => Array ( [id] => 20 [name] => dynasty ) ) [40] => Array ( [0] => Array ( [id] => 40 [name] => meeting ) ) [50] => Array ( [0] => Array ( [id] => 50 [name] => chocolate ) [1] => Array ( [id] => 50 [name] => fantasy ) [2] => Array ( [id] => 50 [name] => football ) ) [10] => Array ( [0] => Array ( [id] => 10 [name] => bananas ) ) ) 

И вот документы для массивов и функций .

 <?php $array = array( 'a' => array ( 'id' => 20, 'names' => 'chimpanzee' ), 'b' => array ( 'id' => 40, 'name' => 'meeting' ), 'c' => array ( 'id' => 20, 'name' => 'dynasty' ), 'd' => array ( 'id' => 50, 'name' => 'chocolate' ), 'e' => array ( 'id' => 10, 'name' => 'bananas' ), 'f' => array ( 'id' => 50, 'name' => 'fantasy' ), 'g' => array ( 'id' => 50, 'name' => 'football' ) ); $result = array(); foreach($array as $key => $value){ $id = $value['id']; if(!isset($result[$id])) $result[$id] = array(); $result[$id] = array($key => $value); } var_dump($result); ?> 

демо: http://codepad.org/yvU95m9k