Во-первых, вы показываете не многомерный массив, а массив объектов StdClass.
Если у вас все в порядке, чтобы сделать их действительно массивами, то это может сделать это:
// initiate result array
$multiArray = array();
// assume $items is your current array
foreach( $items as $item )
{
// cast StdClass to array
$objToArray = (array) $item;
// if this item is initiated already merge it with the current item
$multiArray[ $objToArray[ 'tid' ] ] = isset( $multiArray[ $objToArray[ 'tid' ] ] ) ? $multiArray[ $objToArray[ 'tid' ] ] + $objToArray : $objToArray;
foreach( $objToArray[ 'parents' ] as $parentId )
{
// if parents don't exist yet, initiate them
if( !isset( $multiArray[ $parentId ] ) )
{
$multiArray[ $parentId ] = array(
'children' => array()
);
}
// add this item to the parents children collection by reference (for efficiency)
$multiArray[ $parentId ][ 'children' ][ $objToArray[ 'tid' ] ] = &$multiArray[ $objToArray[ 'tid' ] ];
}
}
С этим вы можете легко найти предметы по id с помощью:
$item = $multiArray[ $someId ];
А чтобы завести ребенка:
$child = $item[ 'children' ][ $someChildId ];
Или все дети:
$children = $item[ 'children' ];
EDIT
Хорошо, я проверил это сейчас, и после добавления нескольких точек с запятой он работает нормально.