php在多维数组中根据键名快速查询其父键以及父键值的代码
php在多维数组中根据键名快速查询其父键以及父键值的代码
发布时间:2016-12-29 来源:查字典编辑
摘要:我这么想的:遍历一遍多维数组,将所有的键建立索引生成一个一维数组;每次通过键名去查这个键的上级数组及数据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');

?>

源文件代码:php_arr.rar

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新php教程学习
热门php教程学习
编程开发子分类