php通过父id键值组成目录,php多维数组根据键名快速查询其父键以及父键值

如何实现呢?请望下看吧。

我这么想的:

遍历一遍多维数组,将所有的键建立索引生成一个一维数组;

每次通过键名去查这个键的上级数组及数据。

indexKey创建索引数组函数:

复制代码 代码如下:

/**

* FILE_NAME : arr.php FILE_PATH : test/

* 在多维数组中根据键名快速查询其父键以及父键值

*

* @copyright Copyright (c) 2006-2010

* @author Levi

* @package test.arr

* @subpackage

* @version 2011-04-29

* @link www.jquerycn.cn

*/

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 '

';

print_r($data);

echo '

';

}

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创建查询索引查询类:

复制代码 代码如下:

/**

* FILE_NAME : arr.php FILE_PATH : test/

* 在多维数组中根据键名快速查询其父键以及父键值

*

* @copyright Copyright (c) 2006-2010

* @author Levi

* @package test.arr

* @subpackage

* @version 2011-04-29

* @link www.jquerycn.cn

*/

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 '

';

print_r($data);

echo '

';

}

function printP(IndexKey $obj, $key)

{

$parent = $obj->search($key);

if ($parent)

{

echo '"'.$key.'" Parent Key is: ';

if (!is_array($parent))

{

echo $parent."
\n";

}

else printA($parent);

}

else echo 'NO Parent OR No Search of "'.$key.'"!'."
\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

* @author Levi

* @package test.arr

* @subpackage

* @version 2011-04-29

* @link www.jquerycn.cn

*/

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 '

';

print_r($data);

echo '

';

}

function printP2(IndexArr $obj, $key)

{

$parent = $obj->search($key);

if (!is_array($parent))

{

if ($parent)

{

echo '"'.$key.'" Parent Key is: '.$parent."
\n";

}

else echo 'NO Parent OR No Search of "'.$key.'"!'."
\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');

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值