У меня довольно большой массив, содержащий данные для всех форумов на доске объявлений, к сожалению, у меня возникает проблема, когда у меня есть повторяющиеся записи для некоторых ключей. Массив упорядочивается в иерархии родителями, поэтому в некоторых случаях он становится глубоким.
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 повторяются как подфорумы для идентификатора форума 2. Мне нужно удалить повторяющиеся ключи, которые находятся на самом низком уровне массива. Таким образом, в этом примере я хотел бы сохранить 15 и 16 в качестве сущностей 6, но удалить их как субтитры 2.
Просто заметьте, я пишу приложение для доски, я не создаю массив, он генерируется платой, поэтому я не могу удалить дубликаты во время создания массива.
Спасибо за вашу помощь.
Возможно, вам следует изменить способ создания этих массивов. лучше предотвратить это
edit: Я вижу … и у вас нет доски, на которой размещено ваше «я»? как глубоко может идти форум? (например, подфорум в подфоруме и т. д. на форуме)
Это должно сделать это:
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);
с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 edit: это не сработает в этом случае 🙂
Почему вы не можете создать новый массив, который вам подходит?
Как вы сказали, вы просто возвращаете этот массив и должны что-то делать с ним.
Моя рекомендация – пройти массив и создать новый, с которым легче справиться.
Новый массив будет выглядеть так:
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]);
с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]);
Сначала это пойдет в самые глубокие части (потому что первый вызов сам по себе) и работает так, как в обратном направлении.