Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP动态地从子数组获取数据_Php_Arrays - Fatal编程技术网

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;
}