从多维数组中删除重复的键

时间:2010-12-26 18:55:44

标签: php multidimensional-array duplicate-removal

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

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

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

谢谢大家的帮助。

5 个答案:

答案 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]);

这将首先进入最深部分(因为第一个呼叫本身)并且向后工作。