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实现ODBC数据分页显示一例
Oct 09 PHP
PHP中的类-什么叫类
Nov 20 PHP
非常不错的MySQL优化的8条经验
Mar 24 PHP
解析php如何将日志写进syslog
Jun 28 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
PHP代码重构方法漫谈
Apr 17 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
js 编程笔记 无名函数
2011/06/28 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
vue中实现动态生成二维码的方法
2020/02/21 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
python3.7添加dlib模块的方法
2020/07/01 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
综合实践活动总结
2014/05/05 职场文书
好学生评语大全
2014/05/05 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
月考总结与反思
2015/10/22 职场文书
初中思品教学反思
2016/02/20 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android