0

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

有什么方法可以在 php 中使用这个字符串来到达我原始数组中的这个位置,而不是获取值,而是对数组的这个特定分支进行更改?

一个例子:

$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';

谢谢

4

5 回答 5

1

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

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

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

var_dump($key);
于 2013-10-09T14:00:42.737 回答
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

于 2013-10-09T13:48:49.920 回答
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]);

}
于 2013-10-09T14:02:33.947 回答
0

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

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

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

于 2018-02-22T10:34:25.277 回答
-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));
}
于 2013-10-09T13:38:33.490 回答