【问题标题】:Get path and value of all elements in nested associative array获取嵌套关联数组中所有元素的路径和值
【发布时间】:2013-06-19 15:00:30
【问题描述】:

考虑一个任意形式和嵌套深度的关联数组,例如:

$someVar = array(
    'name'      => 'Dotan',
    'age'       => 35,
    'children'  => array(
        0 => array(
            'name'  => 'Meirav',
            'age'   => 6,
        ),
        1 => array(
            'name'  => 'Maayan',
            'age'   => 4,
        )
    ),
    'dogs' => array('Gili', 'Gipsy')
);

我想将其转换为路径和值的关联数组:

$someVar = array(
    'name'            => 'Dotan',
    'age'             => 35,
    'children/0/name' => 'Meirav',
    'children/0/age'  => 6,
    'children/1/name' => 'Maayan',
    'children/1/age'  => 4,
    'dogs/0'          => 'Gili',
    'dogs/1'          => 'Gipsy'
);

我开始编写一个递归函数,它对于数组元素会递归,而对于非数组元素(int、浮点数、布尔值和字符串)返回数组$return['path']$return['value']。这很快就草率了! 在 PHP 中有没有更好的方法来做到这一点?我会假设可调用对象和对象不会在数组中传递,尽管处理这种可能性的任何解决方案都是最好的。另外,我假设输入数组的元素名称中没有/ 字符,但考虑到这一点可能是谨慎的! 请注意,输入数组可以嵌套 8 层或更多层!

【问题讨论】:

  • 递归函数最适合您的场景。

标签: php arrays algorithm


【解决方案1】:

递归确实是您能够处理此问题的唯一方法,但这里有一个简单的版本:

function nested_values($array, $path=""){
    $output = array();
    foreach($array as $key => $value) {
        if(is_array($value)) {
            $output = array_merge($output, nested_values($value, (!empty($path)) ? $path.$key."/" : $key."/"));
        }
        else $output[$path.$key] = $value;
    }
    return $output;
}

【讨论】:

  • 谢谢雅各布,这是一个很好的例子!
  • Jacob,我在PHP utility functions 的 github 存储库中使用了您的代码。您当然被列为作者之一。特定功能尚未完成(这是其中的一小部分),但我认为您想知道。
  • 如果想在一个复杂的系统中找到一个值,可以通过打印get_defined_vars来实现。 nested_values 确实有助于找到一条通往深埋价值的完整路径print_r(nested_values(get_defined_vars(),'/'));
【解决方案2】:
function getRecursive($path, $node) {
    if (is_array($node)) {
        $ret = '';
        foreach($node as $key => $val)
            $ret .= getRecursive($path.'.'.$key, $val);
        return $ret;
    }
    return $path.' => '.$node."\n";
}
$r = getRecursive('', $someVar);
print_r($r);

所有你的把它放在一个数组中。

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多