php递归获取分类结构

PHP递归获取分类结构:

/**
 * 两个大类:电脑、手机
 * --手机{三星Glaxy,IphoneX,华为荣耀}
 * --电脑{Dell,Lenovo,IBM}
 */
$data = array(
    array('id' => 1, 'name' => '手机', 'pid' => 0),
    array('id' => 2, 'name' => '三星Glaxy', 'pid' => 1),
    array('id' => 3, 'name' => 'IphoneX', 'pid' => 1),
    array('id' => 4, 'name' => '华为荣耀', 'pid' => 1),
    array('id' => 5, 'name' => '电脑', 'pid' => 0),
    array('id' => 6, 'name' => 'Dell', 'pid' => 5),
    array('id' => 7, 'name' => 'Lenovo', 'pid' => 5),
    array('id' => 8, 'name' => 'IBM', 'pid' => 5)
);

/**
 * 递归获取结构树
 * @param  array $data  数据源
 * @param  integer $pid 父类id
 * @param  integer $level 深度
 * @return array 组装好的树
 */
function get_tree($data, $pid = 0, $level = 0) {
    static $tree = array();
    foreach ($data as $key => $row) {
        if ($row['pid'] == $pid) {
            $row['level'] = $level;
            $tree[] = $row;
            unset($data[$key]); //进入树结构后,接下里要查的就只是它的子类了,所以从$data中删除,减少后面查询次数
            get_tree($data, $row['id'], $level + 1);
        }
    }
    return $tree;
}

/**
 * 输出树结构
 * @param  array 数据源
 * @return void
 */
function echo_tree($tree) {
    foreach ($tree as $row) {
        for ($i = $row['level']; $i > 0; $i--) {
            echo '|----';
        }
        echo $row['name'];
        echo '<br>';
    }
}

$tree = get_tree($data, 0, 0);
var_dump($tree);
echo "<hr>";
echo_tree($tree);
echo "<\n>";

执行结果:

array(8) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "手机"
    ["pid"]=>
    int(0)
    ["level"]=>
    int(0)
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(11) "三星Glaxy"
    ["pid"]=>
    int(1)
    ["level"]=>
    int(1)
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(7) "IphoneX"
    ["pid"]=>
    int(1)
    ["level"]=>
    int(1)
  }
  [3]=>
  array(4) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(12) "华为荣耀"
    ["pid"]=>
    int(1)
    ["level"]=>
    int(1)
  }
  [4]=>
  array(4) {
    ["id"]=>
    int(5)
    ["name"]=>
    string(6) "电脑"
    ["pid"]=>
    int(0)
    ["level"]=>
    int(0)
  }
  [5]=>
  array(4) {
    ["id"]=>
    int(6)
    ["name"]=>
    string(4) "Dell"
    ["pid"]=>
    int(5)
    ["level"]=>
    int(1)
  }
  [6]=>
  array(4) {
    ["id"]=>
    int(7)
    ["name"]=>
    string(6) "Lenovo"
    ["pid"]=>
    int(5)
    ["level"]=>
    int(1)
  }
  [7]=>
  array(4) {
    ["id"]=>
    int(8)
    ["name"]=>
    string(3) "IBM"
    ["pid"]=>
    int(5)
    ["level"]=>
    int(1)
  }
}

输出树结构:
在这里插入图片描述


获取子树:

/**
 * 获取子树
 * @param $array
 * @param int $id
 * @return array
 */
 function getTree($array, $id=0)
{
    $tree = array();
    foreach ($array as $key => $value) {
        if (in_array($id, explode(',',$value['pid']))) {
            $value['children'] = getTree($array, $value['id']);
            if (!$value['children']) {
                unset($value['children']);
            }
            $tree[] = $value;
        }
    }
    return $tree;
}

$tree2 = getTree($data, 0);
var_dump($tree2);

执行结果:

array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "手机"
    ["pid"]=>
    int(0)
    ["children"]=>
    array(3) {
      [0]=>
      array(3) {
        ["id"]=>
        int(2)
        ["name"]=>
        string(11) "三星Glaxy"
        ["pid"]=>
        int(1)
      }
      [1]=>
      array(3) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(7) "IphoneX"
        ["pid"]=>
        int(1)
      }
      [2]=>
      array(3) {
        ["id"]=>
        int(4)
        ["name"]=>
        string(12) "华为荣耀"
        ["pid"]=>
        int(1)
      }
    }
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(5)
    ["name"]=>
    string(6) "电脑"
    ["pid"]=>
    int(0)
    ["children"]=>
    array(3) {
      [0]=>
      array(3) {
        ["id"]=>
        int(6)
        ["name"]=>
        string(4) "Dell"
        ["pid"]=>
        int(5)
      }
      [1]=>
      array(3) {
        ["id"]=>
        int(7)
        ["name"]=>
        string(6) "Lenovo"
        ["pid"]=>
        int(5)
      }
      [2]=>
      array(3) {
        ["id"]=>
        int(8)
        ["name"]=>
        string(3) "IBM"
        ["pid"]=>
        int(5)
      }
    }
  }
}

通过递归返回层级数组:

/**
 * 根据id通过递归返回层级数组
 * @param $lists
 * @param $id
 * @return array
 */
 function getChildren($lists, $id) {
    $list = [];
    $i =  0;
    foreach($lists as $value) {
        if(in_array($id, explode(',',$value['pid']))) {
            $list[$i] = $value;
            $list[$i]['children'] = getChildren($lists, $value['id']);
        }
        $i++;
    }
    if($list) {
        $list = array_values($list);
        return $list;
    } else {
        return [];
    }
}

$tree3 = getChildren($data, 0);
var_dump($tree3);

执行结果:

array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(6) "手机"
    ["pid"]=>
    int(0)
    ["children"]=>
    array(3) {
      [0]=>
      array(4) {
        ["id"]=>
        int(2)
        ["name"]=>
        string(11) "三星Glaxy"
        ["pid"]=>
        int(1)
        ["children"]=>
        array(0) {
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(7) "IphoneX"
        ["pid"]=>
        int(1)
        ["children"]=>
        array(0) {
        }
      }
      [2]=>
      array(4) {
        ["id"]=>
        int(4)
        ["name"]=>
        string(12) "华为荣耀"
        ["pid"]=>
        int(1)
        ["children"]=>
        array(0) {
        }
      }
    }
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(5)
    ["name"]=>
    string(6) "电脑"
    ["pid"]=>
    int(0)
    ["children"]=>
    array(3) {
      [0]=>
      array(4) {
        ["id"]=>
        int(6)
        ["name"]=>
        string(4) "Dell"
        ["pid"]=>
        int(5)
        ["children"]=>
        array(0) {
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(7)
        ["name"]=>
        string(6) "Lenovo"
        ["pid"]=>
        int(5)
        ["children"]=>
        array(0) {
        }
      }
      [2]=>
      array(4) {
        ["id"]=>
        int(8)
        ["name"]=>
        string(3) "IBM"
        ["pid"]=>
        int(5)
        ["children"]=>
        array(0) {
        }
      }
    }
  }
}

参考文章地址:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值