При создании выходного массива вы захотите использовать значимые ключи массива. Таким образом, вы можете найти элемент out, к которому нужно добавить элемент in:
$in = (...your array...);
$out = array();
foreach($in as $element) {
$id = $element['id'];
//If that id hasn't been seen yet, create the out element.
if (!isset($out[$id])) {
$out[$id] = array(
'id'=>$element['id'],
'account_id' => $element['account_id'],
'actions' => array()
);
}
//Add that action to the out element
$out[$id]['actions'][] = array(
'object_id' => $element['object_id'],
'object_type' => $element['object_type'],
'action_type' => $element['action_type']
);
}
Я не уверен, почему ваши входные элементы имеют разные поля ... Если это желаемая функция, где один набор возможных полей принадлежит группе id, а другой набор принадлежит действию, вы можете сделать это вместо этого чуть менее читаемый, но более гибкий):
$in = (...your array...);
$out = array();
//These define which fields from an
//input element belong to the id,
//and which to the action.
$id_fields = array_flip(array('id','account_id','object_user_id');
$action_fields = array_flip(array('object_id','object_type','action_type');
foreach($in as $element) {
$id = $element['id'];
//If that id hasn't been seen yet, create the out element.
if (!isset($out[$id])) {
$out[$id] = array_intersect_key($element, $id_fields);
$out[$id]['actions'] = array();
}
//Add that action to the out element
$out[$id]['actions'][] = array_intersect_key($element, $action_fields);
}
Это лучшее решение, если входные элементы могут отличаться, потому что если ожидаемое поле (отличное от 'id'
) отсутствует, скрипт легко справится с этим.