PHP动态地从子数组获取数据
我有个问题。 具有重命名数组键的脚本 现在,如果需要,我想在子级别数组中执行此操作 当前情况 我目前使用的代码是:PHP动态地从子数组获取数据,php,arrays,Php,Arrays,我有个问题。 具有重命名数组键的脚本 现在,如果需要,我想在子级别数组中执行此操作 当前情况 我目前使用的代码是: ///######## IF THE ORIGINAL KEY HAS BEEN SET if(isset($this->PreparedData[$key]) === true){ ///######## ADD THE DATA TO THE PREPARED DATA VARIABLE $this->Prepared
///######## IF THE ORIGINAL KEY HAS BEEN SET
if(isset($this->PreparedData[$key]) === true){
///######## ADD THE DATA TO THE PREPARED DATA VARIABLE
$this->PreparedData[$value] = $this->PreparedData[$key];
///######## UNSET THE ORIGINAL KEY
unset($this->PreparedData[$key]);
}
但我希望代码能够动态设置以下内容:
///######## IF THE ORIGINAL KEY HAS BEEN SET
if(isset($this->PreparedData[$subKey1][$key]) === true){
///######## ADD THE DATA TO THE PREPARED DATA VARIABLE
$this->PreparedData[$subKey1][$value] =$this->PreparedData[$subKey1][$key];
///######## UNSET THE ORIGINAL KEY
unset($this->PreparedData[$subKey1][$key]);
}
问题
但我想动态地这样做:
///######## IF THE ORIGINAL KEY HAS BEEN SET
if(isset($this->PreparedData[$subKey1][$key]) === true){
///######## ADD THE DATA TO THE PREPARED DATA VARIABLE
$this->PreparedData[$subKey1][$value] =$this->PreparedData[$subKey1][$key];
///######## UNSET THE ORIGINAL KEY
unset($this->PreparedData[$subKey1][$key]);
}
因此可能是:
$this->PreparedData[$subKey1][$key]
而且:
$this->PreparedData[$subKey1][$subKey2][$key]
$this->PreparedData[$subKey1][$subKey2][$subKey3][$key]
而且:
$this->PreparedData[$subKey1][$subKey2][$key]
$this->PreparedData[$subKey1][$subKey2][$subKey3][$key]
这是一个数组
所需情况
所以我可以设定:
MethodName('wheels', array('car', 'mustang'));
这意味着:
$this->PreparedData['car']['mustang']['wheels']
我唯一的问题是。。是如何做到这一点?
因为我也想打电话:
MethodName('wheels');
意思是:
$this->PreparedData['wheels']
谢谢
解决方案是(通过splash58):
function MethodName($key, $path = array()) {
global $array;
$p = &$array; // point to array
foreach($path as $step) // walk trough path to needed level
$p = &$p[$step];
return $p[$key]; //take value
}
$array = array( // test array
'wheels'=> 'wheels1',
'car' => array(
'mustang' => array(
'wheels'=> 'wheels2')));
echo MethodName('wheels', array('car', 'mustang')) . "\n"; // wheels2
echo MethodName('wheels'); // wheels1
把它搬到你的环境中去
function MethodName($key, $path = array()) {
global $array;
$p = &$array; // point to array
foreach($path as $step) // walk trough path to needed level
$p = &$p[$step];
return $p[$key]; //take value
}
$array = array( // test array
'wheels'=> 'wheels1',
'car' => array(
'mustang' => array(
'wheels'=> 'wheels2')));
echo MethodName('wheels', array('car', 'mustang')) . "\n"; // wheels2
echo MethodName('wheels'); // wheels1
声明该方法时,只需让它具有数组参数的默认值。这样做:
function MethodName($valToInsert, $array = array())
{
$arr1 = array();
foreach($array as $key=>$value)
{
$arr1 = arr1[$value];
}
$final_array = $arr1[$valToInsert];
return $final_array;
}
$array = array( // test array
'wheels'=> 'wheels1',
'car' => array(
'mustang' => array(
'wheels'=> 'wheels2')
)
);
traverse($array, 'car.mustang.wheels');
function traverse($array, $path){
if(!is_array($path))
$path = explode(".", $path);
foreach ($path as $key) {
if(isset($array[$key]))
$array = &$array[$key];
else return null;
}
return $array;
}
对于此问题,我使用以下函数:
function traverse($array, $path){
foreach ($path as $key) {
if(isset($array[$key]))
$array = &$array[$key];
else return null;
}
return $array;
}
使用它非常简单:
$array = array( // test array
'wheels'=> 'wheels1',
'car' => array(
'mustang' => array(
'wheels'=> 'wheels2')
)
);
traverse($array, array('car', 'mustang', 'wheels')); // will return 'wheels' if path exists 'null' if not
我个人是这样使用的:
function MethodName($valToInsert, $array = array())
{
$arr1 = array();
foreach($array as $key=>$value)
{
$arr1 = arr1[$value];
}
$final_array = $arr1[$valToInsert];
return $final_array;
}
$array = array( // test array
'wheels'=> 'wheels1',
'car' => array(
'mustang' => array(
'wheels'=> 'wheels2')
)
);
traverse($array, 'car.mustang.wheels');
function traverse($array, $path){
if(!is_array($path))
$path = explode(".", $path);
foreach ($path as $key) {
if(isset($array[$key]))
$array = &$array[$key];
else return null;
}
return $array;
}