网上copy一个数组操作类




    * Node::create(array('a', 'b', 1, true)) => 'a.b.1.1'

    * Node::create('a', 'b', null, false)    => 'a.b'

    * 

    *@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);

    }

}

你可能感兴趣的:(网上copy一个数组操作类)