您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
三六零分类信息网 > 三门峡分类信息网,免费分类信息发布

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

2025/8/26 15:32:42发布3次查看
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创建查询索引查询类:
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 查询父键值
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');?>
复制代码
三门峡分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product