1

我有一个相当大的数组,其中包含留言板上所有论坛的数据,不幸的是,我遇到了一个问题,我有一些键的重复条目。数组按父级按层次结构排序,这就是为什么它在某些点上会变深。

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 的子集。

请注意,我正在为板子编写一个应用程序,我没有生成数组,它是由板子生成的,这就是为什么在创建数组时我无法删除重复项的原因。

谢谢大家的帮助。

4

5 回答 5

1

也许您应该改变创建这些数组的方式。最好防止这种情况发生

编辑:我明白了......你没有董事会主持你自己?一个论坛能走多远?(如子论坛中的子论坛等)

于 2010-12-26T19:06:02.350 回答
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
                        (
                        )
                )
        )
)
于 2010-12-26T19:12:04.290 回答
0

您应该遍历所有数组并应用http://php.net/manual/en/function.array-unique.php 编辑:在这种情况下这不起作用:)

为什么你不能生成适合你的新数组?

于 2010-12-26T18:59:23.650 回答
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]);

这将首先进入最深的部分(因为第一个调用本身就是)并向后工作。

于 2010-12-26T21:52:46.137 回答
0

正如你所说,你只是取回这个数组,需要用它做点什么。

我的建议是遍历数组并创建一个更容易处理的新数组。

新数组如下所示:

array(
    'forum_id' => array(
        'forum_data' => //whatever,
        'parent_forum => // id of parent - greatest id seen as parent
    ),
    ...
);
于 2010-12-26T19:12:32.617 回答