php在多维数组中根据键名快速查询其父键以及父键值的解决办法
内容摘要
这篇文章主要为大家详细介绍了php在多维数组中根据键名快速查询其父键以及父键值的简单示例,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔
对此感兴趣的朋友,看看idc笔记做的技术笔
文章正文
这篇文章主要为大家详细介绍了php在多维数组中根据键名快速查询其父键以及父键值的简单示例,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
我这么想的:遍历一遍多维数组,将所有的键建立索引生成一个一维数组;每次通过键名去查这个键的上级数组及数据OK,代码如下indexKey创建索引数组函数:代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <code> <?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 )); ?> </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | <code> <?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' ); ?> </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | <code> /** * 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' ); ?> </code> |
注:关于php在多维数组中根据键名快速查询其父键以及父键值的简单示例的内容就先介绍到这里,更多相关文章的可以留意
代码注释