Zwei Durchgänge für jeden machen den Trick. Dadurch werden alle untergeordneten Elemente rekursiv mit ihren Eltern verknüpft.
$structure = array();
foreach( $array as $row ) { //add rows to array by id
$structure[ $row["id"] ] = $row + array( "children" => array() );
}
foreach( $structure as &$row ) { //link children to parents
if( ! is_null( $row["parent"] ) ) {
$structure[ $row["parent"] ]["children"][] =& $row;
}
}