使用PHP数组作为索引路径

时间:2011-07-11 21:24:21

标签: php multidimensional-array tree

我在一个扁平的PHP数组中有一个分层数组路径,例如:$path = array('fruit', 'banana', 'fresh');

我将多维数组定义为$tree。您将如何使用$path$tree中设置/获取相应的节点? $tree[$path] = 'blablabl';抛出“非法偏移错误”。我不确定如何破坏()字符串的路径并使用eval()来获取索引。最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

因为数组是一个数组,并且PHP对树没有任何了解,所以你必须自己解决多维数组的路径,但这并不难。

的方式进行迭代

$result = $tree;
foreach ($path as $step) {
  $result = $result[$step];
}

或递归

function resolve_tree ($tree, $path) {
  return empty($path)
         ? $tree
         : resolve_tree ($tree[$path[0]], array_slice($path, 1));
}

请注意,这是最简单的解决方案。例如,在尝试访问之前,您应该注意$path中的给定密钥是否存在。

更新:我忽略了问题中的“设置”部分。没有引用它不那么有趣,因此我建议完全切换到对象而不是数组。它不是必需的,你创建一个类。您只需使用stdClass即可。这甚至会感觉更多“树”ish

答案 1 :(得分:1)

我用引用解决了同样的问题:

function &walk_path(array &$root, array $path)
{
    $cursor = &$root;
    foreach ($path as $e) { $cursor = &$cursor[$e]; }
    return $cursor;
}

$db = [];
$tmp = &walk_path($db, ["users","deanna", "favourite food"]);
$tmp = "chocolate";
print_r($db);

将产生

Array
(
    [users] => Array
        (
            [deanna] => Array
                (
                    [favourite food] => chocolate
                )

        )

)

请注意,由于PHP autovivicates,这将创建任何不存在的键,作为一个数组,唯一的键是路径中的下一个elemenet,如果它是叶节点,则为null。幸运的是,这正是我需要的行为。然而,我仍然有点尴尬,我必须自己在一个语言中编写这个函数,因此专注于它的数组。任何建议缩短这一点都是非常受欢迎的。