С точки зрения алгоритма вам просто необходимо:
Создать пустой массив.
Сканирование каждого элемента массива в исходном массиве, создание нового элемента (в пустом массиве) для каждой обнаруженной новой марки / модели и добавление подмассива размера.
Если запись о бренде / модели уже существует, просто добавьте размер к подмассиву, если его еще нет.
Вы можете реализовать это следующим образом (грубо, но это работает):
<?php
// Test data.
$sourceArray = array(array('brand'=>'ABC', 'model'=>'xyz', 'size'=>13),
array('brand'=>'QWE', 'model'=>'poi', 'size'=>23),
array('brand'=>'ABC', 'model'=>'xyz', 'size'=>18),
);
$newArray = array();
// Create a new array from the source array.
// We'll use the brand/model as a lookup.
foreach($sourceArray as $element) {
$elementKey = $element['brand'] . '_' . $element['model'];
// Does this brand/model combo already exist?
if(!isset($newArray[$elementKey])) {
// No - create the new element.
$newArray[$elementKey] = array('brand'=>$element['brand'],
'model'=>$element['model'],
'size'=>array($element['size']),
);
}
else {
// Yes - add the size (if it's not already present).
if(!in_array($element['size'], $newArray[$elementKey]['size'])) {
$newArray[$elementKey]['size'][] = $element['size'];
}
}
}
// *** DEBUG ***
print_r($newArray);
?>
Кстати, для простоты доступа я сделал так, чтобы подмассив size всегда был массивом. (т. е. вы не должны допускать, чтобы он потенциально был только элементом.)