PHP多维数组元素操作类的方法

5年以前  |  阅读数:775 次  |  编程语言:PHP 

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


    <?php
    /**
     * Created by PhpStorm.
     * User: ZHOUZ
     * Date: 14-5-25
     * Time: 下午5:32
     */

    namespace Snail\Component;

    /**
     * 多维数组节点读写
     * Class Node
     * @package Snail\Component
     */
    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多维数组元素操作类的方法全部内容了,希望大家多多支持脚本之家~

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例