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 相关文章推荐
php session应用实例 登录验证
Mar 16 PHP
PHP 数组基础知识小结
Aug 20 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
php遍历数组的4种方法总结
Jul 05 PHP
PHP中常用的字符串格式化函数总结
Nov 19 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
Jun 20 PHP
简单介绍PHP的责任链编程模式
Aug 11 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
PHP简单实现冒泡排序的方法
Dec 26 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
3种平台下安装php4经验点滴
2006/10/09 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python实现银行管理系统
2019/10/25 Python
python实现简单井字棋小游戏
2020/03/05 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
优秀研究生自我鉴定
2013/12/04 职场文书
二手房买卖协议书
2014/04/10 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
企业文化宣传标语
2014/06/09 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
公司聚餐通知
2015/04/22 职场文书
2015年科普工作总结
2015/07/23 职场文书
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript