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