欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-12-26 11:30:43
我这么想的: 遍历一遍多维数组,将所有的键建立索引生成一个一维数组; 每次通过键名去查这个键的上级数组及数据 ok,代码如下 indexkey创建索引数组函数: 复制代码...
我这么想的:
遍历一遍多维数组,将所有的键建立索引生成一个一维数组;
每次通过键名去查这个键的上级数组及数据
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');
?>

源文件代码: