Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从sql查询创建php数组_Php_Sql_Arrays - Fatal编程技术网

从sql查询创建php数组

从sql查询创建php数组,php,sql,arrays,Php,Sql,Arrays,我试图创建一个数组数组,这样我就可以构建一个动态菜单,但是我在代码中迷失了方向。我的输出如下所示: $menu = Array ( [0] => Array ( [text] => Home [class] => 875 [link] => //Home [show_condition] => TRUE [parent]

我试图创建一个数组数组,这样我就可以构建一个动态菜单,但是我在代码中迷失了方向。我的输出如下所示:

$menu = Array ( 
        [0] => Array ( 
            [text] => Home 
            [class] => 875 
            [link] => //Home 
            [show_condition] => TRUE 
            [parent] => 0 
            ) 
        [1] => Array ( 
            [text] => About 
            [class] => 326 
            [link] => //About 
            [show_condition] => TRUE 
            [parent] => 0 
            ) 
         etc 
         etc 
         etc       
        [339] => Array ( 
            [text] => Planner 
            [class] => 921 
            [link] => //Planner 
            [show_condition] => TRUE 
            [parent] => 45 
            ) 
    ) 
$home = new Menu('Home', '875', '//Home');
$about = new Menu('About', '326', '//About');

//...

$planner = new Menu('Planner', '921', '//Planner', true, $home);

$menu = array($home, $about,...);
function build_menu ( $menu, $showContainer = false)   {
    $out = '';
    if($showContainer) {
        $out = '<div class="container4">' . "\n";
        $out .= '       <div class="menu4">' . "\n";              
    }

    if(!empty($menu)) {
        $out .= '<ul>' . "\n";

        for ($entry in  $menu) {
            if($entry->getShow()) {//are we allowed to see this menu?
                 $out .= '<li class="' . $entry->getClass() . '"><a href="' . $entry->getLink() . '">';
                 $out .= $entry->getText();
                 $out .= '</a>';
                 $out .= "\n" . build_menu($entry->getChildren());
                 $out .= '</li>' . "\n";
             }
        }
        $out .= '</ul>'."\n";
    }
    if($showContainer) {
        $out .= "\n\t" . '</div>';
        $out .= "\n\t" . '</div>';                
    }
    return $out;
}
应构建菜单的两个功能是:

    function build_menu ( $menu )   {
            $out = '<div class="container4">' . "\n";
            $out .= '   <div class="menu4">' . "\n";
            $out .= "\n".'<ul>' . "\n";

            for ( $i = 1; $i <= count ( $menu )-1; $i++ )
            {

if ( is_array ( $menu [ $i ] ) ) {//must be by construction but let's keep the errors home
                    if ( $menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == 0 ) {//are we allowed to see this menu?
                        $out .= '<li class="' . $menu [ $i ] [ 'class' ] . '"><a href="' . $menu [ $i ] [ 'link' ] . '">';
                        $out .= $menu [ $i ] [ 'text' ];
                        $out .= '</a>';
                        $out .= get_childs ( $menu, $i );
                        $out .= '</li>' . "\n";
                    }
                }
                else {
                    die ( sprintf ( 'menu nr %s must be an array', $i ) );
                }
            }

            $out .= '</ul>'."\n";
            $out .= "\n\t" . '</div>';
            return $out . "\n\t" . '</div>';
        }

    function get_childs ( $menu, $el_id )   {
            $has_subcats = FALSE;
            $out = '';
            $out .= "\n".'  <ul>' . "\n";
            for ( $i = 1; $i <= count ( $menu )-1; $i++ )
            {

                if ( $menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == $el_id ) {//are we allowed to see this menu?
                    $has_subcats = TRUE;
                    $add_class = ( get_childs ( $menu, $i ) != FALSE ) ? ' subsubl' : '';
                    $out .= '       <li class="' . $menu [ $i ] [ 'class' ] . $add_class . '"><a href="' . $menu [ $i ] [ 'link' ] . '">';
                    $out .= $menu [ $i ] [ 'text' ];
                    $out .= '</a>';
                    $out .= get_childs ( $menu, $i );
                    $out .= '</li>' . "\n";
                }
            }
            $out .= '   </ul>'."\n";
            return ( $has_subcats ) ? $out : FALSE;
        }
功能构建菜单($menu){
$out=''。“\n”;
$out.=''。“\n”;
$out.=“\n”
    “\n”;
    对于($i=1;$i您的代码就快到了-您可能需要将
    mysql\u fetch\u array
    更改为,您可以使用以下函数将返回的值转换为适当的类型:


    您需要将
    show_condition
    转换为适当的类型-如何转换可能取决于IsVisible是什么列类型。

    我看到您的数组的索引从[0]到[399]

    排列(

    但是您尝试显示从[1]到[340]的项目

    对于($i=1;$i[399])

    解决方案:$i=0;$i
    从0开始一直到399(严格地说是<340)

    我会用另一种方式:面向对象

    class Menu {
      private $children = array();
      private $name = '';
      private $link = '';
      private $class = '';
      private $show = TRUE;
    
      function __construct($name, $class, $link, $show = TRUE, $parent = null) {
        $this->name = $name;
        $this->link = $link;
        $this->class = $class;
        $this->show = $show;
        if(!is_null($parent)) {
            $parent->addChild($this);
        }
      }
    
      function addChild(Menu $child) {
          $this->children[] = $child;
      }
    
      // ... remaining getters (and probably setters)
    }
    
    然后,您可以按如下方式构建菜单:

    $menu = Array ( 
            [0] => Array ( 
                [text] => Home 
                [class] => 875 
                [link] => //Home 
                [show_condition] => TRUE 
                [parent] => 0 
                ) 
            [1] => Array ( 
                [text] => About 
                [class] => 326 
                [link] => //About 
                [show_condition] => TRUE 
                [parent] => 0 
                ) 
             etc 
             etc 
             etc       
            [339] => Array ( 
                [text] => Planner 
                [class] => 921 
                [link] => //Planner 
                [show_condition] => TRUE 
                [parent] => 45 
                ) 
        ) 
    
    $home = new Menu('Home', '875', '//Home');
    $about = new Menu('About', '326', '//About');
    
    //...
    
    $planner = new Menu('Planner', '921', '//Planner', true, $home);
    
    $menu = array($home, $about,...);
    
    function build_menu ( $menu, $showContainer = false)   {
        $out = '';
        if($showContainer) {
            $out = '<div class="container4">' . "\n";
            $out .= '       <div class="menu4">' . "\n";              
        }
    
        if(!empty($menu)) {
            $out .= '<ul>' . "\n";
    
            for ($entry in  $menu) {
                if($entry->getShow()) {//are we allowed to see this menu?
                     $out .= '<li class="' . $entry->getClass() . '"><a href="' . $entry->getLink() . '">';
                     $out .= $entry->getText();
                     $out .= '</a>';
                     $out .= "\n" . build_menu($entry->getChildren());
                     $out .= '</li>' . "\n";
                 }
            }
            $out .= '</ul>'."\n";
        }
        if($showContainer) {
            $out .= "\n\t" . '</div>';
            $out .= "\n\t" . '</div>';                
        }
        return $out;
    }
    
    这只是一个例子。我知道这意味着要创建340个变量来保存菜单。使用其他setter和getter方法可以做得更好,这只是一个快速的“草图”

    您可以按如下方式构建菜单:

    $menu = Array ( 
            [0] => Array ( 
                [text] => Home 
                [class] => 875 
                [link] => //Home 
                [show_condition] => TRUE 
                [parent] => 0 
                ) 
            [1] => Array ( 
                [text] => About 
                [class] => 326 
                [link] => //About 
                [show_condition] => TRUE 
                [parent] => 0 
                ) 
             etc 
             etc 
             etc       
            [339] => Array ( 
                [text] => Planner 
                [class] => 921 
                [link] => //Planner 
                [show_condition] => TRUE 
                [parent] => 45 
                ) 
        ) 
    
    $home = new Menu('Home', '875', '//Home');
    $about = new Menu('About', '326', '//About');
    
    //...
    
    $planner = new Menu('Planner', '921', '//Planner', true, $home);
    
    $menu = array($home, $about,...);
    
    function build_menu ( $menu, $showContainer = false)   {
        $out = '';
        if($showContainer) {
            $out = '<div class="container4">' . "\n";
            $out .= '       <div class="menu4">' . "\n";              
        }
    
        if(!empty($menu)) {
            $out .= '<ul>' . "\n";
    
            for ($entry in  $menu) {
                if($entry->getShow()) {//are we allowed to see this menu?
                     $out .= '<li class="' . $entry->getClass() . '"><a href="' . $entry->getLink() . '">';
                     $out .= $entry->getText();
                     $out .= '</a>';
                     $out .= "\n" . build_menu($entry->getChildren());
                     $out .= '</li>' . "\n";
                 }
            }
            $out .= '</ul>'."\n";
        }
        if($showContainer) {
            $out .= "\n\t" . '</div>';
            $out .= "\n\t" . '</div>';                
        }
        return $out;
    }
    
    function build\u菜单($menu,$showContainer=false){
    $out='';
    如果($showContainer){
    $out=''。“\n”;
    $out.=''。“\n”;
    }
    如果(!空($menu)){
    $out.='
      “\n”; 对于($菜单中的条目){ 如果($entry->getShow()){//,我们可以看到这个菜单吗? $out.='
    • ”; $out.=“\n”.build_菜单($entry->getChildren()); $out.='
    • '。“\n”; } } $out.='
    '。“\n”; } 如果($showContainer){ $out.=“\n\t”。”; $out.=“\n\t”。”; } 退回$out; }
    我没有测试代码,但这是它背后的想法。如果你没有OOP和php的经验,请看一下


    还需要注意的是,这需要PHP5。

    我认为它非常接近工作状态,但我现在收到一条错误消息通知:未定义的偏移量:sitemap2.php中的373在第24行菜单nr 373必须是一个数组查询返回373行,所以最后一行做了一些有趣的事情。有什么想法吗?
    sitemap2.php
    的第24行是什么吗?嗯……看起来是这样要将索引从0开始而不是1放入菜单中,能否相应地调整php数组中($i=0;$i
)的for循环(从偏移量0开始),Dominic comment中的建议将修复错误。这会以某种方式中断所有输出,但进行计数($menu)-1似乎有效。但是,新的问题-它没有生成任何子菜单,只有顶级菜单:xHi,我的数组只到了340,不太确定从哪里得到399!计数问题也在上面的答案中确定,但它不是完全固定的。