php infinite level classification super simple infinite level classification support output tree diagram

  • 2021-07-02 23:48:22
  • OfStack

No platform restrictions
Just tell id, parentid and name


<?php
error_reporting(E_ALL ^ E_NOTICE);

class Tree
{
 
  /**
   +------------------------------------------------
   *  Required for spanning tree structure 2 Dimensional array 
   +------------------------------------------------
   * @author abc
   +------------------------------------------------
   * @var Array
   */
  var $arr = array();
 
  /**
   +------------------------------------------------
   *  The decorative symbols required for spanning tree structure can be replaced by pictures 
   +------------------------------------------------
   * @author abc
   +------------------------------------------------
   * @var Array
   */
  var $icon = array('  The ','  ' ','  Whatever ');
 
  /**
  * @access private
  */
  var $ret = '';
 
  /**
  *  Constructor that initializes the class 
  * @param array 2 An array of dimensions, such as: 
  * array(
  *   1 => array('id'=>'1','parentid'=>0,'name'=>'1 Level column 1'),
  *   2 => array('id'=>'2','parentid'=>0,'name'=>'1 Level column 2'),
  *   3 => array('id'=>'3','parentid'=>1,'name'=>'2 Level column 1'),
  *   4 => array('id'=>'4','parentid'=>1,'name'=>'2 Level column 2'),
  *   5 => array('id'=>'5','parentid'=>2,'name'=>'2 Level column 3'),
  *   6 => array('id'=>'6','parentid'=>3,'name'=>'3 Level column 1'),
  *   7 => array('id'=>'7','parentid'=>3,'name'=>'3 Level column 2')
  *   )
  */
  function tree($arr=array())
  {
    $this->arr = $arr;
    $this->ret = '';
    return is_array($arr);
  }
 
  /**
  *  Get the parent array 
  * @param int
  * @return array
  */
  function get_parent($myid)
  {
    $newarr = array();
    if(!isset($this->arr[$myid])) return false;
    $pid = $this->arr[$myid]['parentid'];
    $pid = $this->arr[$pid]['parentid'];
    if(is_array($this->arr))
    {
      foreach($this->arr as $id => $a)
      {
        if($a['parentid'] == $pid) $newarr[$id] = $a;
      }
    }
    return $newarr;
  }
 
  /**
  *  Get a subseries array 
  * @param int
  * @return array
  */
  function get_child($myid)
  {
    $a = $newarr = array();
    if(is_array($this->arr))
    {
      foreach($this->arr as $id => $a)
      {
        if($a['parentid'] == $myid) $newarr[$id] = $a;
      }
    }
    return $newarr ? $newarr : false;
  }
 
  /**
  *  Get the current position array 
  * @param int
  * @return array
  */
  function get_pos($myid,&$newarr)
  {
    $a = array();
    if(!isset($this->arr[$myid])) return false;
    $newarr[] = $this->arr[$myid];
    $pid = $this->arr[$myid]['parentid'];
    if(isset($this->arr[$pid]))
    {
      $this->get_pos($pid,$newarr);
    }
    if(is_array($newarr))
    {
      krsort($newarr);
      foreach($newarr as $v)
      {
        $a[$v['id']] = $v;
      }
    }
    return $a;
  }
 
  /**
   * -------------------------------------
   *  Get a tree structure 
   * -------------------------------------
   * @author abc
   * @param $myid  Indicates getting this ID All children under 
   * @param $str  Generate the basic code of tree structure ,  For example : "<option value=\$id \$select>\$spacer\$name</option>"
   * @param $sid  Selected ID,  For example, it needs to be used when making a tree drop-down box 
   * @param $adds
   * @param $str_group
   */
  function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
  {
    $number=1;
    $child = $this->get_child($myid);
    if(is_array($child)) {
      $total = count($child);
      foreach($child as $id=>$a) {
        $j=$k='';
        if($number==$total) {
          $j .= $this->icon[2];
        } else {
          $j .= $this->icon[1];
          $k = $adds ? $this->icon[0] : '';
        }
        $spacer = $adds ? $adds.$j : '';
        $selected = $id==$sid ? 'selected' : '';
        @extract($a);
        $parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
        $this->ret .= $nstr;
        $this->get_tree($id, $str, $sid, $adds.$k.'&nbsp;',$str_group);
        $number++;
      }
    }
    return $this->ret;
  }
 
  /**
  *  Ibid. 1 The method is similar , But multiple choices are allowed 
  */
  function get_tree_multi($myid, $str, $sid = 0, $adds = '')
  {
    $number=1;
    $child = $this->get_child($myid);
    if(is_array($child))
    {
      $total = count($child);
      foreach($child as $id=>$a)
      {
        $j=$k='';
        if($number==$total)
        {
          $j .= $this->icon[2];
        }
        else
        {
          $j .= $this->icon[1];
          $k = $adds ? $this->icon[0] : '';
        }
        $spacer = $adds ? $adds.$j : '';
 
        $selected = $this->have($sid,$id) ? 'selected' : '';
        @extract($a);
        eval("\$nstr = \"$str\";");
        $this->ret .= $nstr;
        $this->get_tree_multi($id, $str, $sid, $adds.$k.'&nbsp;');
        $number++;
      }
    }
    return $this->ret;
  }
 
  function have($list,$item){
    return(strpos(',,'.$list.',',','.$item.','));
  }
 
  /**
   +------------------------------------------------
   *  Formatted array 
   +------------------------------------------------
   * @author abc
   +------------------------------------------------
   */
  function getArray($myid=0, $sid=0, $adds='')
  {
    $number=1;
    $child = $this->get_child($myid);
    if(is_array($child)) {
      $total = count($child);
      foreach($child as $id=>$a) {
        $j=$k='';
        if($number==$total) {
          $j .= $this->icon[2];
        } else {
          $j .= $this->icon[1];
          $k = $adds ? $this->icon[0] : '';
        }
        $spacer = $adds ? $adds.$j : '';
        @extract($a);
        $a['name'] = $spacer.' '.$a['name'];
        $this->ret[$a['id']] = $a;
        $fd = $adds.$k.'&nbsp;';
        $this->getArray($id, $sid, $fd);
        $number++;
      }
    }
 
    return $this->ret;
  }
}



$data=array( 
     1 => array('id'=>'1','parentid'=>0,'name'=>'1 Level column 1'), 
     2 => array('id'=>'2','parentid'=>0,'name'=>'1 Level column 2'), 
     3 => array('id'=>'3','parentid'=>1,'name'=>'2 Level column 1'), 
     4 => array('id'=>'4','parentid'=>1,'name'=>'2 Level column 2'), 
     5 => array('id'=>'5','parentid'=>2,'name'=>'2 Level column 3'), 
     6 => array('id'=>'6','parentid'=>3,'name'=>'3 Level column 1'), 
     7 => array('id'=>'7','parentid'=>3,'name'=>''), 
		 8 => array('id'=>'8','parentid'=>3,'name'=>'3 Level column 3'),
		 9 => array('id'=>'9','parentid'=>7,'name'=>'4 Class classification 3'),
     ); 
$tree = new Tree;      
$tree->tree($data);    
 
//  If you use arrays ,  Please use the  getArray Method  
//$tree->getArray(); 
//  Drop-down menu options use  get_tree Method  
$html='<select name="tree">'; 
$str = "<option value=\$id \$select>\$spacer\$name</option>"; 
$html .= $tree->get_tree(0,$str,-1).'</select>'; 
echo $html; 
?>

Related articles: