将子阵列中的位置作为字符串传递

时间:2013-10-09 13:31:44

标签: php arrays syntax

我有一个函数可以在多维数组中搜索键,然后返回路径 在数组内部将我想要的键作为字符串。

有没有什么方法可以在php中使用这个字符串来到我原来的数组中的这个地方,不是为了获得值而是为了更改这个特定的数组bracnch?

一个例子:

$array = array('first_level'=>array(
                   'second_level'=>array(
                          'desired_key'=>'value')));

在此示例中,函数将返回字符串:

  

'first_level => second_level => desired_key'

有没有办法使用此输出,或以不同方式格式化以便以下列或类似方式使用它?

$res = find_deep_key($array,'needle');
$array[$res]['newkey'] = 'injected value';

由于

5 个答案:

答案 0 :(得分:1)

如果密钥路径是安全的(例如,未由用户提供),您可以使用eval并执行以下操作:

$k = 'first_level=>second_level=>desired_key';
$k = explode('=>', $k);
$keys = '[\'' . implode('\'][\'', $k) . '\']';

eval('$key = &$array' . $keys . ';');

var_dump($key);

答案 1 :(得分:0)

我想你想在数组中为你的密钥进行递归搜索?如果我错了,请纠正我。

试试这个

function recursive_array_search($needle,$haystack) {
   foreach($haystack as $key=>$value) {
      $current_key=$key;
      if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
        return $current_key;
      }
   }
return false;
}

从这里采取http://in3.php.net/manual/en/function.array-search.php#91365

答案 2 :(得分:0)

您需要以下内容:

find_key_in_array($key, $array, function($foundValue){

  // do stuff here with found value, e.g.
  return $foundValue * 2;

});

并且实现类似于:

function find_key_in_array($key, $array, $callback){

  // iterate over array fields recursively till you find desired field, then:
  ...
  $array[$key] = $callback($array[$key]);

}

答案 3 :(得分:0)

如果你需要将一些新的子数组附加到多维复杂数组中,并且你知道应该在哪里附加它(你有路径作为字符串),这可能有效(另一种方法没有eval()):< / p>

function append_to_subarray_by_path($newkey, $newvalue, $path, $pathDelimiter, &$array) {
    $destinationArray = &$array;
    foreach (explode($pathDelimiter, $path) as $key) {
        if (isset($destinationArray[$key])) {
            $destinationArray = &$destinationArray[$key];
        } else {
            $destinationArray[$newkey] = $newvalue;
        }
    }
}   

$res = find_deep_key($array,'needle');
append_to_subarray_by_path('newkey', 'injected value', $res, '=>', $array);

当然,只有当路径中的所有键都已存在时,它才会起作用。否则它会将新的子数组附加到错误的位置。

答案 4 :(得分:-1)

只需编写一个接受字符串和数组的函数。该函数将获取每个数组级别的键,然后返回找到的对象。

如:

void object FindArray(Array[] array,String key)
{
if(key.Length == 0) return array;

var currentKey = key.Split('=>')[0];
return FindArray(array[currentKey], key.Remove(currentKey));
}