使用PHP数组作为索引路径

使用PHP数组作为索引路径,php,multidimensional-array,tree,Php,Multidimensional Array,Tree,我在平面PHP数组中有一个分层数组路径,例如:$path=array('fruit','banana','fresh') 我将多维数组定义为$tree。如何使用$path在$tree中设置/获取适当的节点$tree[$path]=“blablabl”抛出“非法偏移错误”。我不确定如何内爆()字符串的路径并使用eval()获取索引。最简单的方法是什么?因为数组就是数组,PHP对树一无所知,所以您必须自己根据多维数组解析路径,但这并不难 迭代夫 $result = $tree; foreach ($

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


我将多维数组定义为
$tree
。如何使用
$path
$tree
中设置/获取适当的节点<代码>$tree[$path]=“blablabl”抛出“非法偏移错误”。我不确定如何内爆()字符串的路径并使用eval()获取索引。最简单的方法是什么?

因为数组就是数组,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
。这甚至会让人觉得有点“树”的味道

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

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,这将创建任何不存在的键,要么作为数组,其中唯一的键是路径中的下一个elemenet,要么如果是叶节点,则为null。幸运的是,这正是我需要的行为。然而,我仍然感到有点奇怪,我不得不自己用一种语言编写这个函数,而这种语言是如此专注于它的数组。非常欢迎任何缩短此长度的建议。

我正在尝试创建
$tree[$path]
,您的方法用于获取节点,但不用于设置节点。
$path
是一个数组,我忘记了那里的索引。见我的更新上面。是的,我没有看“set”,我有点困惑,我使用的是你的object方法:这是你想的吗?注意:给输入变量赋值,使其在路径中有一个非数组的值会导致错误<代码>$db=['users'=>1]“我仍然觉得有点不对劲,我必须自己用一种语言编写这个函数,如此专注于它的数组”-这也是我的想法。