Удалить дубликаты ключей из многомерного массива - PullRequest
1 голос
/ 26 декабря 2010

У меня довольно большой массив, который содержит данные для всех форумов на доске объявлений, к сожалению, я сталкиваюсь с проблемой, когда у меня есть повторяющиеся записи для некоторых ключей.Массив упорядочен родителями по иерархии, поэтому в некоторых моментах он углубляется.

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 ]

1 голос
/ 26 декабря 2010

Может быть, вам следует изменить способ создания этих массивов.лучше не допустить этого

править: Понятно ... а у вас нет форума, на котором вы размещали себя?насколько глубоко может зайти форум?(как подфорум в подфоруме и т. д. на форуме)

1 голос
/ 26 декабря 2010

Это должно сделать это:

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
                        (
                        )
                )
        )
)
0 голосов
/ 27 декабря 2010

Вы должны пройти через массив с помощью рекурсивной функции, что-то вроде этого:

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

Сначала он перейдет к самым глубоким частям (потому что первый вызов сам) и обратный ход.

0 голосов
/ 26 декабря 2010

Как вы сказали, вы только что вернули этот массив и вам нужно что-то с ним сделать.

Я рекомендую пройтись по массиву и создать новый, с которым легче иметь дело.

Новый массив будет выглядеть так:

array(
    'forum_id' => array(
        'forum_data' => //whatever,
        'parent_forum => // id of parent - greatest id seen as parent
    ),
    ...
);
0 голосов
/ 26 декабря 2010

Вы должны перебрать все массивы и применить http://php.net/manual/en/function.array-unique.php редактировать: это не будет работать в этом случае:)

Почему вы не можете сгенерировать новый массив, который вам подходит?

...