Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > выбор из массива элементов встречающихся один раз


Автор: lelik133 31.7.2004, 16:47
Народ помогите, есть следующая задача имееться масиив большой более 75 тыс. элементов, в нем ест элементы которые встречаються один раз есть те которые дублированы несколько раз так вот надо на выходе полукчить два массива один с элементами встречающимися только один раз, а второй с теми котые входят в начальный масиив два раза и более. Как это реализовать на PHP или Perl пока четкого механизма не придумал.

Автор: nevermind 31.7.2004, 19:37
Для этого тебе придется "прощупать" каждый элемент

Создаешь два массива
1 для дубликатов
2 не для дубликатов

Создаешь в исходном итератор, и сравниваешь элементы массива по очереди как только нашел дубликат, то копируй этот элемент в массив 1 и идешь дальше.
Если дубликата не нашлось то копируй в элемент массив 2.

Автор: lelik133 31.7.2004, 21:22
да на этом комп просто повеситься прикинь каждый элемент сравнить с 75 тыс (придеться произвести 75000 в степени 75000 сравнений) нет должна быть стандартная функция которая покажет сколько раз каждый элемент входит в массив

Автор: Ignat 31.7.2004, 22:01
Что-то в мануале ничего не нашел. Есть идея склеить имплодом и прошерстить регами.

Автор: RaZoR 31.7.2004, 22:02
щас... есть одна идея... скоро выложу наверное

Автор: nevermind 31.7.2004, 22:25
Цитата(lelik133 @ 31.7.2004, 20:22)
да на этом комп просто повеситься прикинь  каждый элемент сравнить с 75 тыс (придеться произвести 75000 в степени 75000 сравнений) нет должна быть стандартная функция которая покажет сколько раз каждый элемент входит в массив

Намного меньше на самом деле smile.gif

Ведь если мы уже сранили 1 элемент со 2, то нам совсем не обязательно сравнивать 2 с 1.
Делается просто, на какой позиции сейчас находится итератор, сравнение производится наченая не с 1 элемента, а последующей от итератора позиции

допустим мы имеем 10 элементов, то количество сравнений будет:

9+8+7+6+5+4+3+2+1=45 сравнений smile.gif

но не в коем случае не 10^10=10000000000 как ты написал

Автор: RaZoR 31.7.2004, 22:26
короче вот... написал кое-что... может быть можно лучше, но это первое, что пришло в голову.
$array - начальный массив
$new_array1, $new_array2 - два новых массива
Код
$array=array(345,32141,12,123,768,54,123,123,66,58,34,12,1243,124,124);
$new_array1=array_unique($array);
$new_array2=array();
sort($array);
sort($new_array1);
$size=sizeof($array);
$j=0;
for ($i=0;$i<$size;$i++)
{
if ($array[$i]===$new_array1[$j]) $j++;
else $new_array2[]=$array[$i];
}
$new_array2=array_unique($new_array2);
$new_array1=array_diff($new_array1,$new_array2);

а может я ваще вопрос не понял...

Автор: Kefir 1.8.2004, 11:46
есть такая замечательная ф-ция в ПХП:
http://ee.php.net/manual/en/function.array-count-values.php
надеюсь, что поможет wink.gif

Автор: <Spawn> 1.8.2004, 13:13
Если бы эти данные лежали в талбице базы данных то все было бы просто:

1)
Код
SELECT ArrayValue
  FROM ArrayTable
 GROUP BY ArrayValue
HAVING Count(ArrayValue) = 1


2)
Код
SELECT ArrayValue
  FROM ArrayTable
 GROUP BY ArrayValue
HAVING Count(ArrayValue) > 1

Автор: Graf Zeppelin 1.8.2004, 13:29
Вобще-то если бы была стандартная функция она тоже бы вешала копм smile.gif

Автор: BioMaX 16.7.2009, 16:02
Можно сделать иначе
$string = implode(",", $array);

А дальше пройтись строковой функцией на поиск дубликатов... либо меня глючит ))

Автор: Ипатьев 16.7.2009, 16:10
BioMaX, учитывая, что за 5 (прописью: пять!) лет надобность в решении этого вопроса наверняка отпала, то да - глючит, и при том жестоко.

Автор: lelik133 16.7.2009, 16:43
жесть. BioMaX как вы вообще эту тему откопали.
я уже и не помню для какого проекта мне такая хрень понадобилась. и что как то ее решил тогда это точно smile
эх.. сейчас бы решилось все за пять минут, таблица в бд и count 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)