php-多次元配列から重複するキーを削除します
メッセージボード上のすべてのフォーラムのデータを含むかなり大きな配列がありますが、残念ながら、一部のキーに対して繰り返しエントリがあるという問題が発生しています。配列は親によって階層的に順序付けられているため、ある時点で深くなります。
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()
)
)
)
フォーラムID6のサブフォーラムは、フォーラムID 2のサブフォーラムとして繰り返されます。配列の最下位レベルにある、繰り返されるキーを削除する必要があります。したがって、この例では、15と16を6のサブとして保持し、2のサブとして削除します。
注意点として、私はボード用のアプリケーションを作成しています。アレイは生成していません。ボードによって生成されているため、アレイの作成中に重複を削除することはできません。>
ご協力いただきありがとうございます。
答え :
解決策:
これらの配列の作成方法を変更する必要があるかもしれません。これが起こらないようにすることをお勧めします
編集:なるほど...そしてあなたは自分自身をホストしているボードを持っていませんか?フォーラムはどのくらい深くなることができますか? (フォーラムのサブフォーラムなどのサブフォーラムのように)
答え :
解決策:
これでうまくいくはずです:
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
(
)
)
)
)
答え :
解決策:
すべての配列をループして、http://php.net/manual/en/function.array-unique.phpを適用する必要があります 編集:この場合は機能しません:)
これに合った新しいアレイを生成できないのはなぜですか?
答え :
解決策:
あなたが言ったように、あなたはこの配列を取り戻しているだけで、それを使って何かをする必要があります。
私の推奨事項は、アレイをウォークして、扱いやすい新しいアレイを作成することです。
新しいアレイは次のようになります:
array(
'forum_id' => array(
'forum_data' => //whatever,
'parent_forum => // id of parent - greatest id seen as parent
),
...
);
答え :
解決策:
次のような再帰関数を使用して配列をループする必要があります:
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]);
これは最初に最も深い部分に移動し(最初の呼び出し自体であるため)、逆方向に機能します。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。