php code for quickly querying the parent key and parent key values in a multidimensional array based on the key name

  • 2020-05-05 11:01:35
  • OfStack

Here's what I think:
Walk through the multidimensional array, index all the keys to generate a one-dimensional array;
Each time by the key name to check the key's parent array and data
OK, the code is
indexKey creates an indexed array function:
 
<?php 
/** 
* FILE_NAME : arr.php FILE_PATH : test/ 
*  The parent key and parent key values are quickly queried in a multidimensional array based on the key name  
* 
* @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' => ' China ', 
'cite' => array 
( 
'beijing' => array 
( 
'name' => ' Beijing ', 
'site' => array('chaoyang' => ' Chaoyang district ', 'xuanwu' => ' Xuanwu district ') 
), 
'shanghai' => array 
( 
'name' => ' Shanghai ', 
'site' => array('jingan' => ' Jing'an District ', 'huangpu' => ' Huangpu district ') 
) 
) 
) 
); 
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)); 
?> 

Print out the data as
Array
(
[china] = >
[name] = > china
[cite] = > china
[beijing] = > cite
[site] = > beijing
[chaoyang] = > site
[xuanwu] = > site
[shanghai] = > cite
[jingan] = > site
[huangpu] = > site
)
The problem with writing that way is that if you have the same name key, you lose it, so I wrote a class called
You simply pass the array to the object, which provides two interfaces,
printArr prints the indexed array
search queries the parent array key name
for the key name IndexKey creates query index query class:
 
<?php 
/** 
* FILE_NAME : arr.php FILE_PATH : test/ 
*  The parent key and parent key values are quickly queried in a multidimensional array based on the key name  
* 
* @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' => ' China ', 
'cite' => array 
( 
'beijing' => array 
( 
'name' => ' Beijing ', 
'site' => array('chaoyang' => ' Chaoyang district ', 'xuanwu' => ' Xuanwu district ') 
), 
'shanghai' => array 
( 
'name' => ' Shanghai ', 
'site' => array('jingan' => ' Jing'an District ', 'huangpu' => ' Huangpu district ') 
) 
) 
) 
); 
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'); 
?> 

There was only one data output left, so I changed the class to
Three external methods
are provided printArr prints the indexed array
search queries for the parent array key name
for the key name parentValue queries for the parent key value
 
/** 
* FILE_NAME : arr.php FILE_PATH : test/ 
*  The parent key and parent key values are quickly queried in a multidimensional array based on the key name  
* 
* @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' => ' China ', 
'cite' => array 
( 
'beijing' => array 
( 
'name' => ' Beijing ', 
'site' => array('chaoyang' => ' Chaoyang district ', 'xuanwu' => ' Xuanwu district ') 
), 
'shanghai' => array 
( 
'name' => ' Shanghai ', 
'site' => array('jingan' => ' Jing'an District ', 'huangpu' => ' Huangpu district ') 
) 
) 
) 
); 
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'); 
?> 

Source code: php_arr.rar

Related articles: