我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式:a.b.c 来获取和设置元素,以及多维数组的覆盖,有需求的可以参考下吧!
<?php/** * Created by PhpStorm. * User: ZHOUZ * Date: 14-5-25 * Time: 下午5:32 */namespace SnailComponent;/** * 多维数组节点读写 * Class Node * @package SnailComponent */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);}}
下面举个栗子:
<?phpecho "<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/zhouzmeecho "<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多维数组元素操作类的方法全部内容了,希望大家多多支持脚本之家~