繁体   English   中英

包含 PHP 个类和对象的菜单子菜单

[英]Menu Submenu with PHP Classes and Objects

我需要制作一个带有子菜单的菜单。 菜单“id”=>“parent1”=子菜单“parent”=>“parent1”。 如果父项没有子项,则仅回显父项。 如果父项有子项,则将所有子项插入父项中。 也许尝试使用 for 循环或其他解决方案?

如果存在子菜单,则每个子菜单子菜单都应按 id 插入其父菜单中。 如何?

代码示例应回显:

<div class="menu" href="myurl">Parent 1
     <div class="submenu" href="myurl">Child 1</div>
     <div class="submenu" href="myurl">Child 2</div>
</div>
<div class="menu" href="myurl">Parent 2
     <div class="submenu" href="myurl">Child 3</div> 
</div>
class menu  {
    public $id;
    public $parent;
    public $name;
    public $url;
   
    public function add_node($args) {
    echo '
     <div class="menu" href="' . $args['url'] . '">' . $args['name'] . '
         
         <div class="submenu" href="' . $args['url'] . '">' . $args['name'] . '</div>
         
     </div>';
    }
}

if (class_exists('menu')){
     global $menu;
     $menu = new menu();
}   
        
function menu_parent_child(){
    $args = array(
    'id' => 'parent1', 
    'name' => 'Parent 1',
    'url' => 'myurl'
    ); 
    
    $args = array(
    'parent' => 'parent1', 
    'name' => 'Child 1',
    'url' => 'myurl'
    );
    
    $args = array(
    'parent' => 'parent1', 
    'name' => 'Child 2',
    'url' => 'myurl'
    );
    
    $args = array(
    'id' => 'parent2', 
    'name' => 'Parent 2',
    'url' => 'myurl'
    ); 
    
    $args = array(
    'parent' => 'parent2', 
    'name' => 'Child 3',
    'url' => 'myurl'
    );
}

您的代码有一些问题。 以下是一些建议:

  1. 您将在 menu_parent_child() function 的每次迭代中覆盖 $args 数组,因此只有最后一个元素被添加到菜单中。 您应该为每个元素创建一个新数组。
  2. 您没有将元素添加到菜单中。 您应该为每个元素调用 $menu object 的 add_node() 方法。
  3. 您不应该在 add_node() 方法中使用 echo 语句。 相反,您应该返回一个表示菜单元素 HTML 的字符串。
  4. 您应该有一个单独的方法来将子菜单元素添加到父元素。
  5. 您应该在单独的数据结构中跟踪菜单中的元素,例如数组或 object。这将使您可以轻松检查元素是否有子元素并将子元素添加到父元素。

下面是一些示例代码,演示了如何使用这些更改来实现菜单:

<?php

class Menu {
    private $elements = [];
  
    public function add_node($args) {
      $element = new stdClass();
      $element->id = $args['id'];
      $element->parent = $args['parent'] ?? null;
      $element->name = $args['name'];
      $element->url = $args['url'];
      $element->children = [];
  
      $this->elements[$element->id] = $element;
  
      if ($element->parent) {
        $this->elements[$element->parent]->children[] = $element;
      }
    }
  
    public function get_html() {
      $html = '';
      foreach ($this->elements as $element) {
        if (!$element->parent) {
          $html .= $this->get_element_html($element);
        }
      }
      return $html;
    }
  
    private function get_element_html($element) {
      $html = '<div class="menu" href="' . $element->url . '">' . $element->name;
      if (count($element->children) > 0) {
        $html .= '<div class="submenu">';
        foreach ($element->children as $child) {
          $html .= $this->get_element_html($child);
        }
        $html .= '</div>';
      }
      $html .= '</div>';
      return $html;
    }

  }
  
  if (class_exists('Menu')) {
    $menu = new Menu();
  }
  
  function menu_parent_child() {
    global $menu;
  
    $menu->add_node([
      'id' => 'parent1',
      'name' => 'Parent 1',
      'url' => 'myurl',
    ]);
  
    $menu->add_node([
      'id' => 'child1',
      'parent' => 'parent1',
      'name' => 'Child 1',
      'url' => 'myurl',
    ]);
  
    $menu->add_node([
      'id' => 'child2',
      'parent' => 'parent1',
      'name' => 'Child 2',
      'url' => 'myurl',
    ]);

    $menu->add_node([
        'id' => 'parent2',
        'name' => 'Parent 2',
        'url' => 'myurl',
      ]);

      $menu->add_node([
        'id' => 'child1',
        'parent' => 'parent2',
        'name' => 'Child 1',
        'url' => 'myurl',
      ]);
    
      $menu->add_node([
        'id' => 'child2',
        'parent' => 'parent2',
        'name' => 'Child 2',
        'url' => 'myurl',
      ]);
}

menu_parent_child();
$html = $menu->get_html();
echo $html;`enter code here`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM