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


Posted in PHP onNovember 14, 2016

我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式: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多维数组元素操作类的方法

以上就是小编为大家带来的PHP多维数组元素操作类的方法全部内容了,希望大家多多支持三水点靠木~

PHP 相关文章推荐
模板引擎Smarty深入浅出介绍
Dec 06 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
php文件操作实例代码
May 10 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
Symfony2创建页面实例详解
Mar 18 PHP
php封装的page分页类完整实例
Oct 18 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 #PHP
利用switch语句进行多选一判断的实例代码
Nov 14 #PHP
PHP表单验证内容是否为空的实现代码
Nov 14 #PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 #PHP
10个值得深思的PHP面试题
Nov 14 #PHP
PHP生成word文档的三种实现方式
Nov 14 #PHP
php版微信返回用户text输入的方法
Nov 14 #PHP
You might like
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
php检测文件编码的方法示例
2014/04/25 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
一个超级简单的python web程序
2014/09/11 Python
Python通过future处理并发问题
2017/10/17 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
Python Map 函数的使用
2020/08/28 Python
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
办公室主任先进事迹
2014/01/18 职场文书
2014年教师节寄语
2014/08/11 职场文书
公司委托书格式范本
2014/09/16 职场文书
如何用python绘制雷达图
2021/04/24 Python
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python