我在平面PHP数组中有一个分层数组路径,例如:$path = array('fruit', 'banana', 'fresh');
我将我的多维数组定义为$tree。如何使用$path在$tree中设置/获取适当的节点?$tree[$path] = 'blablabl';会抛出一个“非法偏移错误”。我不确定如何将字符串的路径内爆()并使用eval()来获取索引。做这件事最直接的方法是什么?
发布于 2016-06-14 04:31:52
我用引用解决了同样的问题:
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中的下一个元素,或者如果它是叶节点,则为null。幸运的是,这正是我需要的行为。然而,我仍然感到有点相似,因为我必须自己用一种专注于它的数组的语言来编写这个函数。任何使这篇文章简短的建议都是受欢迎的。
发布于 2011-07-12 05:25:58
因为数组是数组,而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"-part。没有引用并不好笑,因此我建议完全切换到对象而不是数组。创建一个类并不是必需的。您可以简单地使用stdClass。这甚至会让人感觉有点“树”的感觉。
https://stackoverflow.com/questions/6656770
复制相似问题