使用PHP数组作为索引路径

3
我有一个多维数组路径,它在 PHP 的平面数组中,例如:$path = array('fruit', 'banana', 'fresh'); 我将我的多维数组定义为$tree。你如何使用 $path 来设置/获取 $tree 中的适当节点?$tree[$path] = 'blablabl'; 会抛出 "非法偏移错误"。我不确定如何将路径 implode() 成字符串并使用 eval() 获取索引。最简单的方法是什么?
2个回答

3
因为数组就是数组,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 的给定键存在。
更新:我在问题中忽略了“set”部分。如果没有引用,这不太有趣,因此我建议完全切换到对象而不是数组。不需要创建类。您可以简单地使用 stdClass。这甚至会感觉更像是“树形结构”。

我正在尝试创建$tree[$path],您的方法适用于获取节点但不适用于设置节点。 - nnyby
$path 是一个数组,我忘记了一个索引。请看我的更新。是的,我没有看到“set”。 - KingCrunch
我有点困惑,我正在使用您的对象方法:http://pastebin.com/NN1t87HK 这是你想要的吗? - nnyby

2
我用引用解决了相同的问题:
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 自动创建,这将会创建任何不存在的键,这些键要么是一个数组,其中唯一的键是路径中的下一个元素,要么是叶节点为null。幸运的是,这正是我需要的行为。然而,我仍然觉得有点尴尬,因为我必须在一个如此专注于其数组的语言中自己编写此函数。欢迎提出任何缩短代码长度的建议。

注意:将输入变量分配为具有非数组路径的值会导致错误。$db = ['users'=>1]; - ADJenks
“我仍然觉得有点尴尬,因为在一个如此专注于数组的语言中,我必须自己编写这个函数。” - 我也是这么想的。 - ADJenks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接