2010-12-26 8 views
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() 
       ) 
     ) 
) 

В подфорумах на форуме ид 6 повторяются, как подфорум для идентификатора форума 2. Мне нужно удалить повторяющиеся ключи, которые находятся в самом низком уровне массива. Таким образом, в этом примере я хотел бы сохранить 15 и 16 в качестве сущностей 6, но удалить их в качестве подмножеств 2.

Просто заметьте, я пишу приложение для доски, я не создаю массив, это генерируется платой, поэтому я не могу удалить дубликаты во время создания массива.

Благодарим всех вас за помощь.

ответ

0

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

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

+0

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

1

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

Редактировать: Я вижу ... и у вас нет доски, на которой размещено ваше «я»? как глубоко может идти форум? (Как подфорум в подфорум и т.д. в форуме)

+0

Он потенциально неограничен по глубине, но я не думаю, что у меня когда-нибудь будет экземпляр более 4. –

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 
         (
         ) 
       ) 
     ) 
) 
+0

Спасибо , но я пытаюсь сохранить исходную структуру массива, потому что мне нужно поддерживать иерархию. Ваш код объединяет массив. –

+0

Что это значит, что он объединяет массив? Это не так. Это невозможно, поскольку единственная операция, выполняемая в исходном массиве, - 'unset'. См. Выход выше. – netcoder

0

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

Моя рекомендация - пройти массив и создать новый, с которым легче справиться.

Новый массив будет выглядеть следующим образом:

array(
    'forum_id' => array(
     'forum_data' => //whatever, 
     'parent_forum => // id of parent - greatest id seen as parent 
    ), 
    ... 
); 
+0

Проблема в том, что я пытаюсь распечатать иерархию, поэтому, если я переведу ее в массив с родителями, мне придется снова восстановить формат исходного массива. –

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

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

Смежные вопросы