【发布时间】:2014-08-14 11:51:19
【问题描述】:
我正在使用多维 PHP 数组来跟踪对象,如下所示:
Array(
["name1"] => Array(
["data"] => Array(
["children"] => Array(
["name2"] => Array(
["data"] => Array(
["otherData"] => 2
)
),
["name3"] => Array(
["data"] => Array()
)
)
)
),
["name4"] => Array(
["data"] => Array(
["someRandomValue"] => "hi"
)
)
)
这可以是任意数量的级别,所以我会
需要一个递归函数来添加一个新对象。
我想做这样的事情:
function addToArray($item, $array) {
if ($item-getData('insertBefore')) {
//...
}
if ($item-getData('insertAfter')) {
//...
}
if ($item-getData('parent')) {
//...
}
foreach($array as &$arraySlice) {
//..magic here
}
}
基本上,该函数会尝试尊重 3 个数据选项
parent、insertBefore 和 insertAfter 尽其所能。
如果与之前和之后的信息冲突,则会出错
并且缺少父(以及之前/之后)信息只需附加为
最后一个索引,在“name4”之后。
这样一个名为name5的新项目
将parent 设置为name1 和
insertBefore 设置为 name3 插入如下:
Array(
["name1"] => Array(
["data"] => Array(
["children"] => Array(
["name2"] => Array(
["data"] => Array(
["otherData"] => 2
)
),
["name5"] => Array(
["data"] => Array(
["parent"] => "name1",
["insertBefore"] => "name3"
)
),
["name3"] => Array(
["data"] => Array()
)
)
)
),
["name4"] => Array(
["data"] => Array(
["someRandomValue"] => "hi"
)
)
)
有什么建议吗?在我的尝试中,我似乎无法做到这一点。删除任何“nameX”条目的另一个功能也很棒。
编辑:这是我在困惑而放弃之前的最新尝试
function addToArray($item, $array) {
$parent = isset($item->getData('parent')) ? $item->getData('parent') : null;
$before = isset($item->getData('insertBefore')) ? $item->getData('insertBefore') : null;
$after = isset($item->getData('insertAfter')) ? $item->getData('insertAfter') : null;
$parentFound = null;
$prevPart = null;
// use & in the loop to work with a reference
foreach($layout as $key => &$part) {
if ($key == $parent) {
$parentFound = 1;
}
if ($parentFound || !$parent) {
if ($after) {
//..
}
if ($before) {
//..
}
//eh, erhm..
} else if ($part['data']['children']) {
if (addToArray($item, $part)) {
return true;
}
}
$prevPart = $part;
}
return false;
}
【问题讨论】:
-
你有哪些不成功的尝试?
-
好吧,一件事我什至不知道如何在递归地找到它应该在的位置后插入原始数组。记下我在哪里,并使用某种 array_splice 和array_merge 东西?或者,也许最好在我遍历原始数组时构建一个单独的副本,然后在构建副本后替换(或合并)原始数组?我基本上陷入了思考,现在我没有完整的功能可以展示,因为我在中途放弃了大多数尝试。
-
"name" 键至少在您的结构中是唯一的?
-
是的,我还在帖子中添加了我最新的半成品尝试。
-
闻起来像 XY 问题。也许告诉我们你真正想要做什么
标签: php arrays object multidimensional-array