Динамическое выпадающее меню PHP - PullRequest
0 голосов
/ 16 августа 2010

Вот ситуация: у меня есть меню, которое нужно динамически создавать из базы данных.Иерархия меню определяется столбцом «родитель» в таблице (у каждой записи есть один родитель или NULL, если это только родитель)это, учитывая, что мне нужна правильная структура <ul><li><ul><li> для моего выпадающего меню.Это требует, чтобы у меня был «foreach» дочерних страниц, в пределах foreach родительских страниц?Если это имеет смысл, есть ли решение?

К вашему сведению: массив, с которым я работаю, возвращает:

array(31) { 
[0]=>  array(5)
     { ["id"]=>  string(2) "31" ["title"]=>  string(4) "Home" ["linkable"]=>  string(1) "1" ["parent"]=>  NULL ["override"]=>  string(1) " " } 
[1]=>  array(5)
     { ["id"]=>  string(2) "30" ["title"]=>  string(11) "Shop Online" ["linkable"]=>  string(1) "1" ["parent"]=> string(2) "31" ["override"]=>  string(4) "shop" } 

and on and on.

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Вам нужно написать рекурсивную функцию, чтобы сделать это и заставить ее вызывать себя. Я не проверял это, но думаю, это должно помочь вам начать. Я бы не одобрил эффективность этой функции, поскольку она проходит через каждый элемент массива и выполняет сравнение, даже если вам потребуется только один или два элемента из каждого запуска (вероятно).

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), 
    );
0 голосов
/ 17 августа 2010

Рекурсия не требуется.

$parents = array();
$noparents = array();
foreach ($results as $ar) {
  if ( $ar['parent'] != NULL ) {
    $parents[$ar['parent']] = array();
    array_push($parents[$ar['parent']], $ar['title']);
  } else {
    array_push($noparents, $ar['title']);
  }
}

Теперь у вас есть все ваши ссылки, принадлежащие родительскому элементу, перечисленные в массиве с именем родительского элемента.Ваши другие ссылки находятся в отдельном массиве.Вы можете присоединиться к ним, если хотите.

Расширьте его так, как требуется для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...