如何遍历多级数组以获得基于键名数组的值?

时间:2015-02-19 20:59:07

标签: php arrays multidimensional-array traversal

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

$field_names = Array
(
[0] => web
[1] => results
[2] => result
[3] => title
)

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

$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),我不会进入很多细节,因为现有代码是某些处理程序的一部分,该处理程序是某些插件的一部分,该插件是某些module的一部分这是另一个模块的一部分,它是内容管理系统的一部分,用于解析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_walk_recursive(),但我希望避免使用它们让人头疼,以尽可能简化。

是否有任何简单的方法来访问具有动态键名称的多级数组的值?

2 个答案:

答案 0 :(得分:2)

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

您的数据:

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

答案 1 :(得分:1)

这是一种简单的方法,不是使用引用递归(取自How to write getter/setter to access multi-level array by key names?):

function get($object, $path) {
    $prop = array_shift($path);
    $temp =& $object->$prop;

    foreach($path as $key) {
        $temp =& $temp[$key];
    }
    return $temp;
}

$value = get($values, $field_names)['content']; //PHP 5.4.0