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

あなたが言ったように、あなたはこの配列を取り戻したばかりで、何かをする必要があります。

私のお勧めは、配列を調べて、扱いやすい新しい配列を作成することです。

新しい配列は次のようになります。

array(
    'forum_id' => array(
        'forum_data' => //whatever,
        'parent_forum => // id of parent - greatest id seen as parent
    ),
    ...
);
于 2010-12-26T19:12:32.617 に答える
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 に答える