• PHP多维数组元素操作类


    我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式:a.b.c 来获取和设置元素,以及多维数组的覆盖,有需求的可以参考下吧!

    <?php
    /**
     * Created by PhpStorm.
     * User: ZHOUZ
     * Date: 14-5-25
     * Time: 下午5:32
     */
    
    namespace SnailComponent;
    
    /**
     * 多维数组节点读写
     * Class Node
     * @package SnailComponent
     */
    class Node extends AComponent
    {
        /**
         * 多维数组节点分隔符
         * @var string
         */
        const SP = '.';
    
        /**
         * 将非字符串类型数据生成字符串节点
         * <code>
         * Node::create(array('a', 'b', 1, true)) => 'a.b.1.1'
         * Node::create('a', 'b', null, false)    => 'a.b'
         * </code>
         * @param mixed $nodes 支持数组、任意参数个数
         * @return string
         */
        public static function create($nodes) {
            ! is_array($nodes) && $nodes = func_get_args();
            return join(static::SP, array_filter(array_map('strval', $nodes)));
        }
    
        /**
         * 获取多维数组节点转化为数组键名
         * @param string $node
         * @return array
         */
        public static function explode($node) {
            return explode(static::SP, $node);
        }
    
        /**
         * 设置多维数组节点值
         * 注意:
         * 由于 PHP 数组数值键名长度只支持 int 的最大长度,
         * 为避免出现覆盖等混乱现象,所有节点在转化为键名时都将
         * 强制被转换为字符串类型
         * @param array & $arr 引用被操作数组的内存地址
         * @param string $node 节点路径, 如: a.b.c => $arr['a']['b']['c'];
         * @param mixed $value
         * @return void
         */
        public static function set(array & $arr, $node, $value = null) {
            $arr = $arr2 = (array) $arr;
            $keys = static::explode($node);
            foreach ($keys as $key) {
                $key = strval($key);
                if (isset($arr[$key])) {
                    $arr = & $arr[$key];
                } else {
                    $arr[$key] = array();
                    $arr = & $arr[$key];
                }
            }
            $arr = $value;
        }
    
        /**
         * 获取多维数组指定节点值
         * @param array & $arr 引用被操作数组的内存地址
         * @param string $node 节点路径, 如: a.b.c => $arr['a']['b']['c'];
         * @param null|mixed $default 若节点不存在时返回该默认值
         * @return mixed
         */
        public static function get(array & $arr, $node, $default = null) {
            if (empty($arr)) return $default;
            $keys = static::explode($node);
            foreach ($keys as $key) {
                $key = strval($key);
                if (isset($arr[$key])) {
                    $arr = & $arr[$key];
                } else {
                    return $default;
                }
            }
            return $arr;
        }
    
        /**
         * 将第二个多维数组覆盖或添加到第一个多维数组进行合并
         * @param array & $arraySrc 引用被更新的数组
         * @param array & $arrayReplace 引用需要合并的数据
         * @return void 地址操作无返回值
         */
        public static function merge(array & $arraySrc, array & $arrayReplace) {
            if (empty($arrayReplace)) return;
            foreach ($arrayReplace as $k=>& $v) {
                if (is_array($v) && isset($arraySrc[$k])) {
                    static::merge($arraySrc[$k], $v);
                } else {
                    $arraySrc[$k] = $v;
                }
            }
        }
    
        /**
         * 判断多维数组中是否存在指定节点,
         * 结果同 isset 关键字 (若存在键但值为 NULL 则也会返回 false)
         * @param array & $arr 引用原数组
         * @param string $node
         * @return bool
         */
        public static function has(array & $arr, $node) {
            if (empty($arr)) return false;
            $keys = static::explode($node);
            foreach ($keys as $key) {
                $key = strval($key);
                if (isset($arr[$key])) {
                    $arr = & $arr[$key];
                } else {
                    return false;
                }
            }
            return true;
        }
    
        /**
         * 判断多维数组中是否存在指定键
         * @param array & $arr 引用原数组
         * @param string $node
         * @return bool
         */
        public static function hasKey(array & $arr, $node) {
            if (empty($arr)) return false;
            $keys = static::explode($node);
            foreach ($keys as $key) {
                $key = strval($key);
                if (array_key_exists($key, $arr)) {
                    $arr = & $arr[$key];
                } else {
                    return false;
                }
            }
            return true;
        }
    
        /**
         * 注销数组中的指定节点元素
         * @param array $arr
         * @param string $node
         * @return void
         */
        public static function clear(array & $arr, $node) {
            if (empty($arr)) return;
            $keys = static::explode($node);
            foreach ($keys as $key) {
                $key = strval($key);
                if (isset($arr[$key])) {
                    $arr = & $arr[$key];
                } else {
                    return; // 指定节点不存在亦认为是成功
                }
            }
            $arr = null;
            unset($arr);
        }
    } 

    下面举个栗子:

    <?php
    echo '<pre>';
    // 测试数组1
    $arr1 = ['a'=>['b'=>['c'=>['d'=>['e'=>['f'=>'http://blog.csdn.net/zhouzme']]]]]];
    // 测试数组2
    $arr2 = ['a'=>['b'=>['c'=>['h'=>['i'=>['j'=>'http://www.hihtml5.com/']]]]]];
    
    echo '读取已存在的多维元素: ';
    echo Node::get($arr1, 'a.b.c.d.e.f', '默认值');  // http://blog.csdn.net/zhouzme
    echo '<hr>';
    
    echo '读取不存在的多维元素: ';
    echo Node::get($arr1, 'a.b.c.d.e.g', '默认值');  // 默认值
    echo '<hr>';
    
    echo '新增多维元素: ';
    Node::set($arr1, 'a.b.c.d.e.g', 'http://www.ai9475.com/');
    print_r($arr1);
    echo '<hr>';
    
    echo '读取新增的多维元素: ';
    echo Node::get($arr1, 'a.b.c.d.e.g', '默认值');  // http://www.ai9475.com/
    echo '<hr>';
    
    echo '合并两个数组<br>';
    Node::merge($arr1, $arr2);
    print_r($arr1);

    下面是对应的输出结果:

    PHP多维数组元素操作类

  • 相关阅读:
    悟透JavaScript(理解JS面向对象的好文章)
    ClassLoader的等级加载机制
    ClassLoader的类结构分析
    如何实现自己的ClassLoader
    Servlet的ClassLoader
    idea远程调试linux下的tomcat
    centos VM 识别U盘
    linux yum 命令
    centos 基本操作(快捷键开户终端,复制,粘贴,yum命令)
    CentOS 配置Apache+Mysql+PHP (yum)与卸载
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758394.html
Copyright © 2020-2023  润新知