Я недавно ответил на аналогичный вопрос. Здесь это так. Надеюсь, что это соответствует вашим потребностям. Если нет, дайте мне знать, и я приспособлю его к вашим спецификациям.
EDIT
Хорошо, вот настроенная версия, которая должна соответствовать вашим потребностям.
function generateMultiArray( array $flatArray )
{
// initiate result array
$multiArray = array();
// iterate $flatArray
foreach( $flatArray as $item )
{
// for convenience, initiate these vars
$id = $item[ 'ID' ];
$parentId = $item[ 'parentcat_ID' ];
// initiate this item's children array;
$item[ 'children' ] = array();
// if parent doesn't exist yet, initiate it along with an empty 'children' array
if( !isset( $multiArray[ $parentId ] ) )
{
$multiArray[ $parentId ] = array(
'children' => array()
);
}
// if this item is initiated already (as being a parent) merge it with the current item
$multiArray[ $id ] = isset( $multiArray[ $id ] ) ? $multiArray[ $id ] + $item : $item;
// add this item to the parents children collection by reference (for efficiency)
$multiArray[ $parentId ][ 'children' ][ $id ] = &$multiArray[ $id ];
}
return $multiArray;
}
Помните, что эта функция также делает все элементы доступными в качестве корневого элемента массива результатов с их идентификатором в качестве индекса.
Итак, чтобы получить доступ к дочерним элементам с произвольным идентификатором n, вы должны сделать:
$multiArray = generateMultiArray( $yourFlatArray );
$children = $multiArray[ n ][ 'children' ]; // replace n with the id
РЕДАКТИРОВАТЬ 2
Забыл ввести дочерний массив для элементов, которые не являются родительскими; добавлено сейчас. В противном случае это приведет к уведомлению при попытке получить к нему доступ:
$multiArray = generateMultiArray( $yourFlatArray );
$children = $multiArray[ $someIdWithoutChildren ][ 'children' ];