如何遍历多级数组以根据键名数组获取值?
How to traverse into multi-leveled array to get value based on array of key names?
给定以下格式的键名数组(字段数可以更改):
$field_names = Array
(
[0] => web
[1] => results
[2] => result
[3] => title
)
我想访问以下多级数组的 '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),我不会深入细节,因为现有代码是某些处理程序的一部分,是某些插件的一部分,而插件又是某些 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()
,但我想避免使用它们的麻烦,以使其尽可能简单。
是否有任何简单的方法来访问具有键名动态数组的多级数组的值?
这里有一个简单的方法,不是使用引用递归(取自):
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
递归解也可以很简单
您的数据:
$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'];
给定以下格式的键名数组(字段数可以更改):
$field_names = Array
(
[0] => web
[1] => results
[2] => result
[3] => title
)
我想访问以下多级数组的 '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),我不会深入细节,因为现有代码是某些处理程序的一部分,是某些插件的一部分,而插件又是某些 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()
,但我想避免使用它们的麻烦,以使其尽可能简单。
是否有任何简单的方法来访问具有键名动态数组的多级数组的值?
这里有一个简单的方法,不是使用引用递归(取自
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
递归解也可以很简单
您的数据:
$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'];