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

  1. C# 指定格式的字符串截成一维数组(二维数组)的操作类

    指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...

  2. 【JAVA SE】第五章 数组、多维数组和Arrays类

    第五章 数组.多维数组和Arrays类 文章目录 第五章 数组.多维数组和Arrays类 一.数组 1.概述 2.声明数组变量 3.创建数组 4.For-Each 循环 二.多维数组 1.概述 2.多 ...

  3. C++使用VARIANT实现二维数组的操作

    VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之间的互相调用是比较耗时的,尤其带当组件位于不 ...

  4. C++使用VARIANT实现二维数组的操作、怎么使用COleSafeArray实现二维数组将字符串写入excel

    配合OLED_V2的excel操作 C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.dou ...

  5. 多维数组元素的下标引用与指针访问

    在这儿值介绍二维数组元素的访问方式,三维.四维--的与之类似. 先用一维数组的相关知识来抛砖 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h ...

  6. 3 5的二维数组C语言程序,C语言及程序设计提高例程-33 二维数组元素的引用

    贺老师教学链接  C语言及程序设计提高 本课讲解 输入输出二维数组元素 #include int main() { int s[3][5], i, j; printf("Input 3*5 ...

  7. 编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推。

    编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推.     例如,原始二维数组为,逆向存放后变为.试建立一个类 ...

  8. C语言二维数组元素的多种表示方法小结

    C语言二维数组元素的多种表示方法小结 昨天,一个小可爱问我,为何函数中,数组可以改变主函数中的值,比如b[i],就可以改原来数组中的值.其实b[i] 等价于 *(b + i)也是通过地址间接更改的,小 ...

  9. php 数组元素往后移动,php 二维数组 元素移动

    [已关闭问题] 关闭于 2014-11-20 16:02 二维数组元素如何实现,满足一定的条件,跳到下下个元素,不满足的话,顺序执行呢? 比如: header("Content-type:t ...

最新文章

  1. 赛门铁克公布Q3财报 亏损68亿美元
  2. vaadin_Vaadin和DukeScript中的Hello World
  3. 百度高级Java三面题目!涵盖JVM +Java锁+分布式等
  4. client does not support authentication
  5. 属马的人性格有什么缺点和优点?
  6. Useful link
  7. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)
  8. oracle共享池的结构,Oracle 10g内存结构之共享池的相关知识及使用简介
  9. 总结全网最全的数据学习平台
  10. QQ扫码登录实现与原理
  11. H5页面,华为手机打开不加载JS的问题
  12. Ubuntu学习笔记(2)---安装LumaQQ
  13. PRD文档详解(20191209)
  14. Python 获取每月的工作日天数 (法定假+周末)天数
  15. kaggle猫狗大战数据集集(百度云)
  16. 绝地求生组装电脑配置推荐2021 适合玩吃鸡游戏电脑清单
  17. Python调用百度AI接口
  18. 【用复制粘贴让脚本动起来(二)】根据画面点击特定坐标
  19. [论文笔记]Maiter:一种基于Delta的累积迭代计算的异步图处理框架
  20. 利用52单片机制作的超声波避障小车(包含所有源码)

热门文章

  1. DreamMail的DmData.dao文件损坏的解决方法
  2. 极智嘉Geek+全柔性智能分拣系统首次落地英国,赋能ASDA拥有更强物流能力
  3. English trip EM2- PE 5A COMMUNICATION 交流 Teacher:Corrine
  4. 我们该如何学好Java?
  5. K-means与GMM分别对球队数据进行聚类
  6. 阿里巴巴赴美上市,市值将超千亿
  7. 应届生考编上岸选岗、备考经验
  8. 如何制作SWD接口接线,并使用keil4_Jlink烧录芯片
  9. 导致服务器中毒的行为有哪些
  10. 匿名上位机使用方法分享--高级收码