如果我有一个包含['key1', 'key2', 'key3']
的数组,有没有办法将它映射到数组$array['key1']['key2']['key3']
而不使用循环或eval()?
数组示例:
$var = [
'key1' => [
'subkey1' => [
'finalkey' => 'value',
],
'subkey' => [
'otherkey' => 'value',
],
],
'key2' => 'blah'
];
然后我有一个像这样的数组:
$keys = ['key1', 'subkey1', 'finalkey']
或
$keys = ['key1', 'subkey']
答案 0 :(得分:5)
function array_find($needle, &$haystack)
{
$current = array_shift($needle);
if(!isset($haystack[$current]))
{
return null;
}
if(!is_array($haystack[$current]))
{
return $haystack[$current];
}
return array_find($needle, $haystack[$current]);
}
答案 1 :(得分:2)
未经测试,来自similar answer到另一个问题。
function get_value($dest, $path)
{
# allow for string paths of a/b/c
if (!is_array($path)) $path = explode('/', $path);
$a = $dest;
foreach ($path as $p)
{
if (!is_array($a)) return null;
$a = $a[$p];
}
return $a;
}
这应该比递归解决方案更好。
答案 2 :(得分:2)
我为personal framework提出了以下非递归方法:
function Value($data, $key = null, $default = false)
{
if (isset($key) === true)
{
if (is_array($key) !== true)
{
$key = explode('.', $key);
}
foreach ((array) $key as $value)
{
$data = (is_object($data) === true) ? get_object_vars($data) : $data;
if ((is_array($data) !== true) || (array_key_exists($value, $data) !== true))
{
return $default;
}
$data = $data[$value];
}
}
return $data;
}
用法:
var_dump(Value($array, 'key1.subkey1.finalkey')); // or
var_dump(Value($array, array('key1', 'subkey1', 'finalkey')));
可以通过删除对象和默认值支持以及其他检查来进一步简化。