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邮件专题
Oct 09 PHP
目录,文件操作详谈―PHP
Nov 25 PHP
Dedecms常用函数解析
Feb 01 PHP
一些需要禁用的PHP危险函数(disable_functions)
Feb 23 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
Lumen timezone 时区设置方法(慢了8个小时)
Jan 20 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 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
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
JS 判断代码全收集
2009/04/28 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
JS实现小星星特效
2019/12/24 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
python安装gdal的两种方法
2019/10/29 Python
Django异步任务线程池实现原理
2019/12/17 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
python如何编写win程序
2020/06/08 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
护士演讲稿范文
2014/01/05 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
小学校长汇报材料
2014/08/20 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL