这里有新鲜出炉的PHP面向对象编程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于web开发领域。PHP的文件后缀名为php。
下面小编就为大家带来一一篇PHP多维数组元素操作类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式: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);
下面是对应的输出结果:
来源: http://www.phperz.com/article/17/0830/341198.html