[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как грамотно отсеять повторяющиеся элементы массив
kav1
Доброго времени суток.

Есть у меня массив $list, содержащий ОЧЕНЬ большое кол-во значений, которые повторяются много раз в разных вариантах - например, "птичка", "Птичка", "ПТИЧКА" и т.д.

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

Код вообще такой:


foreach($list as $v){
echo '<a href="birds.php?word=';
echo $v;
echo '">';
}


Если я до этого кода сделаю вот так:

$list = array_unique(array_map('mb_strtoupper', $list));

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

А как бы уже в самом foreach отсеять регистронезависимо это дело? Чтобы в нем создавался уже отсеянный массив, а потом вывести ссылки? Все упирается у меня в то, что грузится сильно хостинг в том варианте, что сверху, нужна альтернатива
inpost
mav1
Я вот что не могу понять. В чём проблема долгого выполнения? Если тебе это надо сделать 1 раз, то в фоновом режиме сделай и готовый результат уже помести в свою БД, откуда данные и будешь выводить. А в дальнейшем дубли не добавляй при изменении и внесении новых данных в систему.

Если проблемы с памятью, то по частям обработай через array_map, потом отсортируй массив, а потом удаляй уникальные.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
BaNru
mav1, расставь по коду временные метки time() (разумеется для удобства сделай, чтобы показывало сколько от начала прошло времени, ну ты знаешь...)
При этом размельчи код.

time();
$list = array_map('mb_strtoupper', $list);
time();
$list = array_unique($list);
time();


Найдешь узкое место. И уже с ним надо будет работать.

Например если он в цикле, то могу предложить бредовую идею, теоретически можно собрать массив через RegExp. Только быстрее ли будет.
Valick
mav1, откуда вы берёте этот массив?


_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Работая с функциями работы с массивами, надо понимать, что они внутри себя точно также гоняют циклы. Не зная в деталях алгоритм их работы, сложно предполагать, как именно это всё происходит. Но в любом случае эти функции не сделают свою работу мгновенно.

Я бы вот так сделал в описанной ситуации, без функций:
$new_arr = array();
foreach( $old_arr as $key => $val )
{
$new_arr[ mb_strtoupper($key) ]= $val;
}

На выходе будет массив с заведомо уникальными ключами :)


Цитата (Valick @ 12.04.2014 - 07:24)
откуда вы берёте этот массив?

И да, это тоже важный вопрос. Потом что если данные идут из БД, то там это всё можно сделать, чтобы в ПХП получить уже готовый результат.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
FatCat
Цитата (sergeiss @ 12.04.2014 - 09:34)
$new_arr[ mb_strtoupper($key) ]= $val;

Ты хочешь сказать вот так:
$new_arr[ mb_strtoupper($val) ]= mb_strtoupper($val);
?

Так в самом деле работает.
$list = array("птичка", "Птичка", "ПТИЧКА", "скворец", "СКВОРЕЦ", "Скворец");
$tmp_array = array();
foreach($list as $v)$tmp_array[ strtoupper($v) ] = strtoupper($v);
echo("<pre>");print_r($tmp_array);echo("</pre>");die();
Array
(
[ПТИЧКА] => ПТИЧКА
[СКВОРЕЦ] => СКВОРЕЦ
)


_____________
Бесплатному сыру в дырки не заглядывают...
sergeiss
Цитата (FatCat @ 12.04.2014 - 12:04)
Ты хочешь сказать вот так:.....

Воблин... Я прочитал почему-то про уникальные ключи, а не значения smile.gif Сорри, да, мой код относится именно к ключам в разных регистрах, а не к значениям.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
kav1
Спасибо, товарищи, за представленные варианты, сейчас буду чесать репу и пробовать))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.