Вам нужно написать рекурсивную функцию, чтобы сделать это и заставить ее вызывать себя. Я не проверял это, но думаю, это должно помочь вам начать. Я бы не одобрил эффективность этой функции, поскольку она проходит через каждый элемент массива и выполняет сравнение, даже если вам потребуется только один или два элемента из каждого запуска (вероятно).
PHP:
$arr = array(...);
function output_lis($parentID = NULL){
global $arr;
$stack = array(); //create a stack for our <li>'s
foreach($arr as $a){
$str = '';
//if the item's parent matches the parentID we're outputting...
if($a['parent']===$parentID){
$str.='<li>'.$a['title'];
//Pass this item's ID to the function as a parent,
//and it will output the children
$subStr = output_lis($a['id']);
if($subStr){
$str.='<ul>'.$subStr.'</ul>';
}
$str.='</li>';
$stack[] = $str;
}
}
//If we have <li>'s return a string
if(count($stack)>0){
return join("\n",$stack);
}
//If no <li>'s in the stack, return false
return false;
}
Затем выведите это на свою страницу. Что-то вроде:
<ul>
<?php echo output_lis(); ?>
</ul>
Вот мой примерный массив:
$arr = array(
array('title'=>'home','parent'=>NULL,'id'=>1),
array('title'=>'sub1','parent'=>1,'id'=>2),
array('title'=>'sub2','parent'=>1,'id'=>3),
array('title'=>'about us','parent'=>NULL,'id'=>4),
array('title'=>'sub3','parent'=>4,'id'=>5),
array('title'=>'sub4','parent'=>4,'id'=>6),
);