php在多维数组中根据键名快速查询其父键以及父键值的代码


Posted in PHP onMay 07, 2011

我这么想的:
遍历一遍多维数组,将所有的键建立索引生成一个一维数组;
每次通过键名去查这个键的上级数组及数据
OK,代码如下
indexKey创建索引数组函数:

<?php 
/** 
* FILE_NAME : arr.php FILE_PATH : test/ 
* 在多维数组中根据键名快速查询其父键以及父键值 
* 
* @copyright Copyright (c) 2006-2010 mail:levi@cgfeel.com 
* @author Levi 
* @package test.arr 
* @subpackage 
* @version 2011-04-29 
*/ 
header("Content-Type: text/html; charset=utf-8"); 
$arr = array 
( 
'china' => array 
( 
'name' => '中国', 
'cite' => array 
( 
'beijing' => array 
( 
'name' => '北京', 
'site' => array('chaoyang' => '朝阳区', 'xuanwu' => '宣武区') 
), 
'shanghai' => array 
( 
'name' => '上海', 
'site' => array('jingan' => '静安区', 'huangpu' => '黄浦区') 
) 
) 
) 
); 
function printA($data) 
{ 
echo '<pre>'; 
print_r($data); 
echo '</pre>'; 
} 
function indexKey($data, $parent = NULL) 
{ 
$arr = array(); 
foreach ($data as $key => $value) 
{ 
$arr[$key] = $parent; 
if (is_array($value)) 
{ 
$arr += indexKey($value, $key); 
} 
} 
return (Array)$arr; 
} 
printA(indexKey($arr)); 
?>

打印出数据如下
Array
(
[china] =>
[name] => china
[cite] => china
[beijing] => cite
[site] => beijing
[chaoyang] => site
[xuanwu] => site
[shanghai] => cite
[jingan] => site
[huangpu] => site
)
不过上面那样写存在一个问题,即:如果有同名键,会造成丢失,于是我写了这么一个类
只需要将数组传递给对象,对象提供两个接口
printArr 打印索引数组
search 查询键名的父数组键名
IndexKey创建查询索引查询类:
<?php 
/** 
* FILE_NAME : arr.php FILE_PATH : test/ 
* 在多维数组中根据键名快速查询其父键以及父键值 
* 
* @copyright Copyright (c) 2006-2010 mail:levi@cgfeel.com 
* @author Levi 
* @package test.arr 
* @subpackage 
* @version 2011-04-29 
*/ 
header("Content-Type: text/html; charset=utf-8"); 
$arr = array 
( 
'china' => array 
( 
'name' => '中国', 
'cite' => array 
( 
'beijing' => array 
( 
'name' => '北京', 
'site' => array('chaoyang' => '朝阳区', 'xuanwu' => '宣武区') 
), 
'shanghai' => array 
( 
'name' => '上海', 
'site' => array('jingan' => '静安区', 'huangpu' => '黄浦区') 
) 
) 
) 
); 
function printA($data) 
{ 
echo '<pre>'; 
print_r($data); 
echo '</pre>'; 
} 
function printP(IndexKey $obj, $key) 
{ 
$parent = $obj->search($key); 
if ($parent) 
{ 
echo '"'.$key.'" Parent Key is: '; 
if (!is_array($parent)) 
{ 
echo $parent."<br />\n"; 
} 
else printA($parent); 
} 
else echo 'NO Parent OR No Search of "'.$key.'"!'."<br /><br />\n"; 
} 
class IndexKey 
{ 
private $_arr = array(); 
public function __construct($data) 
{ 
$this->_createIndex($data); 
} 
public function printArr() 
{ 
return (Array)$this->_arr; 
} 
public function search($key) 
{ 
return isset($this->_arr[$key]) ? $this->_arr[$key] : NULL; 
} 
private function _createIndex($data, $parent = NULL) 
{ 
foreach ($data as $key => $value) 
{ 
$this->_checkIndex($key, $parent); 
if (is_array($value)) 
{ 
$this->_createIndex($value, $key); 
} 
} 
} 
private function _checkIndex($key, $parent) 
{ 
$index = isset($this->_arr[$key]) ? $this->_arr[$key] : NULL; 
if ($index) 
{ 
if (is_array($index)) 
{ 
array_push($this->_arr[$key], $parent); 
} 
else $this->_arr[$key] = array($index, $parent); 
} 
else $this->_arr[$key] = $parent; 
} 
} 
$index = (Object)new IndexKey($arr); 
printA($index->printArr()); 
printP($index, 'beijing'); 
printP($index, 'name'); 
printP($index, 'china'); 
?>

最后只差一个数据的输出了,于是我将这个类修改了下
提供了三个对外的方法
printArr 打印索引数组
search 查询键名的父数组键名
parentValue 查询父键值
/** 
* FILE_NAME : arr.php FILE_PATH : test/ 
* 在多维数组中根据键名快速查询其父键以及父键值 
* 
* @copyright Copyright (c) 2006-2010 mail:levi@cgfeel.com 
* @author Levi 
* @package test.arr 
* @subpackage 
* @version 2011-04-29 
*/ 
header("Content-Type: text/html; charset=utf-8"); 
$arr = array 
( 
'china' => array 
( 
'name' => '中国', 
'cite' => array 
( 
'beijing' => array 
( 
'name' => '北京', 
'site' => array('chaoyang' => '朝阳区', 'xuanwu' => '宣武区') 
), 
'shanghai' => array 
( 
'name' => '上海', 
'site' => array('jingan' => '静安区', 'huangpu' => '黄浦区') 
) 
) 
) 
); 
function printA($data) 
{ 
echo '<pre>'; 
print_r($data); 
echo '</pre>'; 
} 
function printP2(IndexArr $obj, $key) 
{ 
$parent = $obj->search($key); 
if (!is_array($parent)) 
{ 
if ($parent) 
{ 
echo '"'.$key.'" Parent Key is: '.$parent."<br />\n"; 
} 
else echo 'NO Parent OR No Search of "'.$key.'"!'."<br />\n";; 
echo '"'.$key.'" Parent "'.$parent.'" Value is: '; 
printA($obj->parentValue($key)); 
} 
else printA($parent); 
} 
class IndexArr 
{ 
private $_arr = array(); 
public function __construct($data) 
{ 
$this->_createIndex($data); 
} 
public function printArr() 
{ 
return (Array)$this->_arr; 
} 
public function search($key) 
{ 
return isset($this->_arr[$key]) ? $this->_arr[$key]['parent'] : NULL; 
} 
public function parentValue($key) 
{ 
return isset($this->_arr[$key]) ? $this->_arr[$key]['data'] : NULL; 
} 
private function _createIndex($data, $parent = NULL) 
{ 
foreach ($data as $key => $value) 
{ 
$this->_checkIndex($key, $parent, $data); 
if (is_array($value)) 
{ 
$this->_createIndex($value, $key); 
} 
} 
} 
private function _checkIndex($key, $parent, $data) 
{ 
$data = $parent && isset($data[$parent]) ? $data[$parent] : $data; 
!isset($this->_arr[$key]) && $this->_arr[$key] = array('data' => $data, 'parent' => ''); 
$index = &$this->_arr[$key]['parent']; 
if (!empty($index)) 
{ 
if (is_array($index)) 
{ 
array_push($index, $parent); 
} 
else $index = array($index, $parent); 
} 
else $index = $parent; 
} 
} 
$index2 = (Object)new IndexArr($arr); 
printA($index2->printArr()); 
printP2($index2, 'beijing'); 
printP2($index2, 'name'); 
printP2($index2, 'china'); 
?>

源文件代码:php_arr.rar
PHP 相关文章推荐
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
PHP的curl实现get,post和cookie(实例介绍)
Jun 17 PHP
PHP常用正则表达式集锦
Aug 17 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
php中namespace及use用法分析
Dec 06 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
php 大数据量及海量数据处理算法总结
May 07 #PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 #PHP
php调用mysql数据 dbclass类
May 07 #PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 #PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
May 07 #PHP
php数据库抽象层 PDO
May 07 #PHP
php cookies中删除的一般赋值方法
May 07 #PHP
You might like
php抓取页面与代码解析 推荐
2010/07/23 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
javascript里的条件判断
2007/02/27 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
python实现BackPropagation算法
2017/12/14 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python opencv之分水岭算法示例
2018/02/24 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python如何求解两数的最大公约数
2018/09/27 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
如何利用python 读取配置文件
2021/01/06 Python
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
人力资源专业推荐信
2013/11/29 职场文书
公司寄语大全
2014/04/10 职场文书
服装发布会策划方案
2014/05/22 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书