Php 如何遍历到多级数组中,根据键名数组获取值?

Php 如何遍历到多级数组中,根据键名数组获取值?,php,arrays,multidimensional-array,traversal,Php,Arrays,Multidimensional Array,Traversal,给定以下格式的键名称数组(字段数可以更改): 我想访问以下多级数组的“内容”键值: $values=stdClass Object( [web] => Array( [results] => Array( [result] => Array( [title] => Array( [type] => default [content] => Sample content

给定以下格式的键名称数组(字段数可以更改):

我想访问以下多级数组的“内容”键值:

$values=stdClass Object(
  [web] => Array(
    [results] => Array(
      [result] => Array(
        [title] => Array(
          [type] => default
          [content] => Sample content
        )
      )
    )
  )
)
给定上述数组时如何访问值的示例:

$value = $values->{$field_names[0]}[$field_names[1]][$field_names[2]][$field_names[3]]['content'];
为了简单起见(让它成为普通PHP),我将不深入讨论太多细节,因为现有代码是某个处理程序的一部分,该处理程序是某个插件的一部分,该插件是另一个模块的一部分,该模块是内容管理系统的一部分,用于解析YQL结果,但其逻辑被破坏

代码如下所示:

$field = array_shift($field_names);
$value = $values->$field;
foreach ($field_names as $field) {
  if (is_array($value)) {
    $value = $value[$field];
  }
}
我试过做一个脏补丁,比如:

$value = is_string($value[$field]) ? $value[$field] : $value[$field]['content'];
它适用于一个例子,但并不适用于所有情况,如上面的一个

我知道递归函数和array\u walk\u recursive(),但我想避免使用它们带来的麻烦,以使其尽可能简单


有没有简单的方法可以访问具有动态键名数组的多级数组的值?

这里有一种简单的方法,不是使用引用递归的(取自):


递归解决方案也可以很简单

您的数据:

$field_names = Array("web", "results","result","title");
$values->web["results"]["result"]["title"]=
            Array("type"=> "default", "content"=>"Sample content");
职能:

function getField($obj, $keys) {
    return ($key=array_shift($keys)) ? getField($obj[$key], $keys) : $obj["content"];
}

echo getField((Array)$values, $field_names);
但是如果您想要一个非递归的,那么它就是:

$obj=(Array)$values;
while ($key=array_shift($field_names)) $obj=$obj[$key];
echo $obj['content'];

有点相关:经过测试的递归一行程序,非常简单,非常有效,谢谢。贴上补丁。看那个@Adam。你刚刚帮了一个对Drupal的承诺!如果他们不把我的名字给下一个版本,我就不明白了
function getField($obj, $keys) {
    return ($key=array_shift($keys)) ? getField($obj[$key], $keys) : $obj["content"];
}

echo getField((Array)$values, $field_names);
$obj=(Array)$values;
while ($key=array_shift($field_names)) $obj=$obj[$key];
echo $obj['content'];