淘宝双十一活动

php节点父节点常用的操作方法

 PHP基础  2020-08-04  admin  193  260

php节点父节点常用的操作方法

/**
 * 节点操作类
 * Class Node
 * @package App\Library
 * @author centphp.com
 */
class NodeLibrary
{
    /**
     * 配置
     * @var array
     */
    public static $config = [
        'pid_name' => 'pid',
        'id_name' => 'id',
    ];

    /**
     * 配置
     * @param $config
     * @return NodeLibrary
     * @author centphp.com
     */
    public static function config(array $config = []): object
    {
        self::$config = array_merge(self::$config, $config);
        return new self;
    }

    /**
     * 获取 $pid 下的所有子节点
     * @param $data
     * @param int $pid
     * @param string $html
     * @param int $level
     * @return array  二维数组
     * @author centphp.com
     */
    static public function getNode(array $data, int $pid = 0, string $html = '--', int $level = 0): array
    {
        $arr = array();
        foreach ($data as $k => $v) {
            if ($v[self::$config['pid_name']] == $pid) {
                $v['level'] = $level + 1;

                $v['html'] = str_repeat($html, $v['level']);
                //$arr['_'.self::$config['id_name']] = $v;
                $arr[] = $v;
                $arr = array_merge($arr, self::getNode($data, $v[self::$config['id_name']], $html, $level + 1));
            }
        }
        return $arr;
    }

    /**
     * 根据$pid获取其所有子节点,树形结构,包括$pid数据
     * @param array $data 二维数组
     * @param string $name
     * @param int $pid
     * @return array 多维数组
     * @author centphp.com
     */
    static public function getTreeNode(array $data, int $pid = 0, string $name = 'child'): array
    {
        $arr = array();
        foreach ($data as $k => $v) {
            if ($v[self::$config['pid_name']] == $pid) {
                $v[$name] = self::getTreeNode($data, $v[self::$config['id_name']], $name);
                $arr[$k] = $v;
            }
        }
        return $arr;
    }

    /**
     * 获取$id一个子分类ID返回所有的父级分类
     * @param $data
     * @param $id
     * @return array
     * @author centphp.com
     */
    static public function getParentsNode(array $data, int $id): array
    {
        $arr = array();
        foreach ($data as $v) {
            if ($v[self::$config['id_name']] == $id) {
                $arr[] = $v;
                $arr = array_merge(self::getParentsNode($data, $v[self::$config['pid_name']]), $arr);
            }
        }
        return $arr;
    }

    /**
     * 获取$pid父级分类返回所有子分类ID
     * @param array $data
     * @param int $pid
     * @return array
     * @author centphp.com
     */
    static public function getChildNodeIds(array $data, int $pid): array
    {
        $arr = array();
        foreach ($data as $v) {
            if ($v[self::$config['pid_name']] == $pid) {
                $arr[] = $v[self::$config['id_name']];
                $arr = array_merge($arr, self::getChildNodeIds($data, $v[self::$config['id_name']]));
            }
        }
        return $arr;
    }

    /**
     * 获取$pid父级分类返回所有子分类
     * @param $data
     * @param $pid
     * @return array
     * @author centphp.com
     */
    static public function getChildNode($data, $pid)
    {
        $arr = array();
        foreach ($data as $v) {
            if ($v[self::$config['pid_name']] == $pid) {
                $arr[] = $v;
                $arr = array_merge($arr, self::getChildNode($data, $v[self::$config['id_name']]));
            }
        }
        return $arr;
    }
    
}

使用示例:

$array = [
    ['id' => '44', 'name' => '广东省', 'parent_id' => '0'],
    ['id' => '440111', 'name' => '白云区', 'parent_id' => '4401'],
    ['id' => '440103', 'name' => '荔湾区', 'parent_id' => '4401'],
    ['id' => '440106', 'name' => '天河区', 'parent_id' => '4401'],
    ['id' => '4401', 'name' => '广州市', 'parent_id' => '44'],
    ['id' => '4403', 'name' => '深圳市', 'parent_id' => '44'],
    ['id' => '440303', 'name' => '罗湖区', 'parent_id' => '4403'],
    ['id' => '440304', 'name' => '福田区', 'parent_id' => '4403'],
    ['id' => '4404', 'name' => '珠海市', 'parent_id' => '44'],
    ['id' => '37', 'name' => '山东省', 'parent_id' => '0'],
    ['id' => '32', 'name' => '江苏省', 'parent_id' => '0'],
    ['id' => '3701', 'name' => '济南市', 'parent_id' => '37'],
    ['id' => '3702', 'name' => '青岛市', 'parent_id' => '37'],
    ['id' => '3703', 'name' => '淄博市', 'parent_id' => '37'],
    ['id' => '370102', 'name' => '历下区', 'parent_id' => '3701'],
    ['id' => '370105', 'name' => '天桥区', 'parent_id' => '3701'],
    ['id' => '370212', 'name' => '崂山区', 'parent_id' => '3702'],
    ['id' => '370211', 'name' => '黄岛区', 'parent_id' => '3702'],
];

方法1:

$result = NodeLibrary::config(['pid_name' => 'parent_id'])->getNode($array, 0, '*');

1.png

方法2:

$result = NodeLibrary::config(['pid_name' => 'parent_id', 'id_name' => 'id'])->getTreeNode($array, 0);

2.png

方法3:

$result = NodeLibrary::config(['pid_name' => 'parent_id', 'id_name' => 'id'])->getParentsNode($array, '440303');

3.png

方法4:

$result = NodeLibrary::config(['pid_name' => 'parent_id', 'id_name' => 'id'])->getChildNodeIds($array, '44');

4.png

方法5:

$result = NodeLibrary::config(['pid_name' => 'parent_id', 'id_name' => 'id'])->getChildNode($array, '44');

6.png

生成间隔

foreach ($result as $key => $val) {
    echo "<br>";
    echo $val['level'] > 1 ? str_repeat('&emsp;', $val['level']) . '├' . $val['name'] : $val['name'];
}

5.png

转载必须注明出处:

php节点父节点常用的操作方法 —— centphp

相关推荐


appnode Linux 服务器集群管理面板

appnode Linux 服务器集群管理面板集中式设计,快速切换管理安装一个控制中心即可管理你的所有服务器,其它服务器只需要安装受控端。再也不用分别登录到每台服务器去管理了。不限制服务器数量集中显示运行状况在线 SSH 终端连接分组管理自定义节点名称支持通过 SSH 隧道连接受控端多用户服务器权限管理(开发中)强大的网站管理功能通过整合 Nginx、PHP、MySQL 等组件,帮助您快速创建和配

国内常用静态资源 CDN 公共库加速服务

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的