Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Нужна функция обработки простого одномерного массива
цитата
02/06/09 в 17:17
 webmaster779
Имеется массив с уникальными и неуникальными значениями. Нужно на выходе сформировать два массива $unique и $nonunique. В первом содержатся значения, которые встречаются только один раз, во втором - два и более. Кто возьмется?
цитата
02/06/09 в 17:27
 True Alex
array_count_values не подходит? разделить результирующий массив на два - это дело техники уже

http://ru.php.net/manual/en/function.array-count-values.php
цитата
02/06/09 в 17:51
 Scheme
Код:

<?
//   $MainArray = array_map('rtrim', file("array.txt"));
$MainArray = array(4,5,1,2,5,4,3,0);
   $unique = array();
   $nonunique = array();
   $tmpArray = array_count_values($MainArray);

   foreach ($tmpArray as $key => $value)
      if ($value == 1)
         $unique[] = $key;
      else
         $nonunique[] = $key;

   echo "uniq:<br>";
   foreach ($unique as $item)
      echo $item."<br>";
   echo "non uniq:<br>";
   foreach ($nonunique as $item)
      echo $item."<br>";

?>

за отзыв возьмусь. отзывы оставлять в подписи icon_wink.gif
цитата
02/06/09 в 19:31
 webmaster779
Спасибо! array_count_values конечно лучший вариант.
цитата
02/06/09 в 21:04
 _s_[sov]
Код:
array_unique();
цитата
02/06/09 в 21:07
 Scheme
_s_[sov] писал:
Код:
array_unique();

создает массив с неповторяющимися элементами. то есть было 1233, станет 123.
не подходит, а так было бы неплохо конечно сделать array_unique а потом array_diff - вообще пара строк кода )
цитата
02/06/09 в 21:08
 _s_[sov]
Scheme: Цитата:
которые встречаются только один раз

все верно делает эта функция... сам же ниже ее предложил smail101.gif
цитата
02/06/09 в 23:18
 Corex
Scheme:
Вполне подходит, причём именно так, как ты описал, только вместо array_diff надо использовать array_diff_assoc:

Код:
$data_array = array(4,5,1,2,5,4,3,0,4,5,0,0);
$unique = array_unique($data_array);
$duplicate = array_diff_assoc($data_array, $unique);
цитата
03/06/09 в 07:33
 Scheme
2Corex
тз: "В первом содержатся значения, которые встречаются только один раз, во втором - два и более."
то есть был массив 12333, на выходе будут массивы 12 и 3.
твой вариант в первый массив затолкает 123, во второй - 33.
цитата
03/06/09 в 09:36
 Corex
Scheme
Ну это уже мелочь, ещё раз array_unique применить - просто же додумать базовую идею...

Код:
$data_array = array(1,2,3,3,3);
$unique = array_unique($data_array);
$duplicate = array_unique(array_diff_assoc($data_array, $unique));
цитата
03/06/09 в 12:43
 Dr.Syshalt
Corex: а как ты думаешь, задача программера - использовать как можно меньше буквочег или таки написать оптимальный код? ;)

Почему я говорю, что нельзя начинать программировать с php - люди даже не задумываются, что под капотом у этих "волшебных" функций. array_diff, вообще-то - очень медленная функция. array_unuque - тоже. У тебя подряд 3 функции, у которых порядок O(N log N) в лучшем случае, а вообще-то, O(N^2) в худшем. Сэкономив несколько строк кода в сравнении с вариантом с array_count_values (который наиболее оптимален, кстати), в разы проигрываешь по производительности.
цитата
03/06/09 в 14:29
 Corex
Dr.Syshalt: а вот ты как думаешь, стоит ли начинать умничать, если сути ты даже и не понял? Ну перечитай же ты ещё раз тему с самого начала, проследи с какой точки и почему появились эти два варианта. Это ведь даже не альтернатива!

Хочется высказаться - так по сути, а то с превентивными проповедями и ведром помоев, что совершенно без толку. ;)
цитата
03/06/09 в 17:32
 Dr.Syshalt
Ну если оценка производительности алгоритма считается у некоторых "умничать" и "флэймить, разводить holy wars" - то тут комменты излишни.


Эта страница в полной версии