Sql sorguları php diziler oluşturma

3 Cevap php

Ben bir dinamik menü oluşturmak, böylece diziler bir dizi oluşturmak için çalışıyorum, ama ben kodu arasında kaybolmadan ediyorum. Benim çıkış bu gibi görünüyor:

$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 
            ) 
    )

Ve menü oluşturmak gerektiğini iki işlevleri şunlardır:

    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;
        }

Ama menü herhangi bir alt seviyelerini göstermek için reddediyor - sadece üst seviyesini gösterir. Herhangi bir fikir?

Teşekkürler!

3 Cevap

i dizi [399] [0] dan dizinleri görüyoruz

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 
    )  )

ancak [340] [1] öğeleri göstermeye çalışacağım

(; $ i) = sayısı <($ menü; $ i + + = 1 $ i) için

($ menüsü) saymak 340 döndürür ([0] -> [399])

Çözüm: (= 0 $ i; $ i sayısı ($ menüsü <); $ i + +) için

0 başlamak ve 399 (kesinlikle <340) kadar gitmek

Ben başka bir şekilde bunu yapardı: nesne yönelimli.

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)
}

Sonra bu gibi menü oluşturabilirsiniz:

$home = new Menu('Home', '875', '//Home');
$about = new Menu('About', '326', '//About');

//...

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

$menu = array($home, $about,...);

Bu sadece bir örnektir. Bu sizin menüyü tutmak için 340 değişkenleri oluşturmak demek ki farkındayım. Diğer belirleyici ve alıcı yöntemleri ile daha iyi yapabilirsiniz, bu sadece bir hızlı 'kroki' dir.

Böyle menü oluşturabilirsiniz:

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;
}

Ben kodu test etmedi, ama bu onun arkasındaki fikirdir. OOP ve php ile hiçbir deneyimi varsa official documentation bakabilirsiniz.

Ve ayrıca bu PHP5 gerektirdiğini unutmayın.