2010-12-26 20 views
1

メッセージボード上のすべてのフォーラムのデータを含むかなり大きな配列を持っています。残念ながら、私はいくつかのキーに対して繰り返しエントリがある問題を抱えています。配列は親によって階層化されているため、いくつかの点で深くなっています。フォーラム番号6に多次元配列から重複キーを削除する

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

サブフォーラムは、私は、アレイの最も低いレベルにある繰り返しキーを削除する必要がフォーラム番号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]); 

は、これが最初の最も深い部分に移動します(理由最初の呼び出しはそれ自身です)、それを逆戻りします。

関連する問題