我有一个相当大的数组,其中包含留言板上所有论坛的数据,不幸的是我遇到了一个问题,我正在为某些键重复输入。数组按父母的层次结构排序,这就是为什么它在某些点上变得很深。
Array
(
[0] => Array
(
[cat_data] => Array()
[forum_data] => Array
(
[2] => Array
(
[subforums] => Array
(
[6] => Array
(
[subforums] => Array
(
[15] => Array()
[16] => Array()
)
)
[7] => Array()
[15] => Array()
[16] => Array()
)
)
[3] => Array()
)
)
)
论坛ID 6上的子论坛作为论坛ID 2的子论坛重复。我需要删除阵列最低级别的重复键。所以在这个例子中,我想保留15和16作为6的子集,但是将它们作为2的子集删除。
请注意,我正在为电路板编写应用程序,我没有生成数组,它是由电路板生成的,这就是为什么我在创建数组时无法删除重复项。
谢谢大家的帮助。
答案 0 :(得分:1)
也许您应该改变创建这些数组的方式。最好是防止这种情况发生
编辑:我明白了...你没有董事会主持你的自我?论坛有多深? (就像论坛中的子论坛中的子论坛一样)
答案 1 :(得分:1)
这应该这样做:
function remove_dup_keys(array &$array) {
$keys = array();
foreach ($array as $key => &$value) {
if (is_array($value)) {
$keys = array_merge($keys, remove_dup_keys($value));
}
}
foreach ($keys as $key) {
if (is_numeric($key) && in_array($key, $keys)) {
unset($array[$key]);
}
}
$keys = array_merge($keys, array_keys($array));
return $keys;
}
remove_dup_keys($yourarray);
你得到:
Array
(
[0] => Array
(
[cat_data] => Array
(
)
[forum_data] => Array
(
[2] => Array
(
[subforums] => Array
(
[6] => Array
(
[subforums] => Array
(
[15] => Array
(
)
[16] => Array
(
)
)
)
[7] => Array
(
)
)
)
[3] => Array
(
)
)
)
)
答案 2 :(得分:0)
您应遍历所有数组并应用http://php.net/manual/en/function.array-unique.php 编辑:在这种情况下不会起作用:)
为什么你不能生成适合你的新阵列呢?
答案 3 :(得分:0)
正如你所说,你只是回到这个阵列,需要用它做点什么。
我的建议是走数组并创建一个更容易处理的新数组。
新数组如下所示:
array(
'forum_id' => array(
'forum_data' => //whatever,
'parent_forum => // id of parent - greatest id seen as parent
),
...
);
答案 4 :(得分:0)
你应该使用递归函数遍历数组,如下所示:
function remove_dupes(&$arr,$keys = array()) {
if (is_array($arr['subforums']) {
$keys = remove_redundants($arr['subforums'],$keys);
}
foreach ($arr as $k => $v) {
if (in_array($k,$keys)) {
unset($arr[$k]);
} else {
$keys[] = $k;
}
}
return $keys;
}
remove_dupes($forumarray[forum_data]);
这将首先进入最深部分(因为第一个呼叫本身)并且向后工作。