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 相关文章推荐
ajax php 实现写入数据库
Sep 02 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
PHP代码优化的53个细节
Mar 03 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
php禁止浏览器使用缓存页面的方法
Nov 07 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
ioncube_loader_win_5.2.dll的错误解决方法
Jan 04 PHP
PHP SPL标准库之接口(Interface)详解
May 11 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 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
Php部分常见问题总结
2006/10/09 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
smarty简单应用实例
2015/11/03 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
详解VUE 数组更新
2017/12/16 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python程序中的观察者模式结构编写示例
2016/05/27 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
python中学习K-Means和图片压缩
2017/11/20 Python
Random 在 Python 中的使用方法
2018/08/09 Python
用python做游戏的细节详解
2019/06/25 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
德国电子商城:ComputerUniverse
2017/04/21 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
Nginx反向代理、重定向
2022/04/13 Servers