当前位置: 移动技术网 > IT编程>开发语言>PHP > php在多维数组中根据键名快速查询其父键以及父键值的代码

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

2019年04月22日  | 移动技术网IT编程  | 我要评论
我这么想的:
遍历一遍多维数组,将所有的键建立索引生成一个一维数组;
每次通过键名去查这个键的上级数组及数据
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');
?>

源文件代码:

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网