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


Автор: -V- 26.3.2005, 19:56
Постановка задачи:

Существует массив записей string

a[0] = "петя";
a[1] = "маша";
a[2] = "петя";
a[3] = "сырожа";
a[4] = "вова";
...
a[n] = "cdefghjklmnpoq";

как видно некоторые записи в разных елементах совпадают...

Вопрос:
Как на PHP написать скрипт очистки совпадений в массиве ... т.е. чтобы например запись "петя" не повторялась, а была записана только в первый елемент массива, со здвигом всех остальных елементов. ???


П.С.

Если до обработки все данные в массиве равны "петя" то в массиве остаётся одна запись

Благодарности
Спасибо огромное за помощь smile

Автор: Irokez 26.3.2005, 20:29
array_unique()

Автор: -V- 27.3.2005, 00:26
Ты что серьёзно одной функией????? ОТЭТО Я ТУПОЙ!!!!
Спасибо!

Автор: VoAnt 27.3.2005, 02:52
Так, есть проблеммы..

Дело в том что унификация через функцию, не сдвигает массив .. т.е. кол-во елементов остаётся прежним! А НУЖНО ЧТОБ унификация была не только совпадений но и уменьшение размера массива..

Я пытался делать через if .. не рпботает .. посмотрите код в чем ошибка?

Код

<?

$ar[0] = "111";
$ar[1] = "111";
$ar[2] = "222";
$ar[3] = "111";
$ar[4] = "222";
$ar[5] = "444";
$ar[6] = "222";
$ar[7] = "444";
$ar[8] = "333";
$ar[9] = "333";

$ar = array_unique($ar);

echo "************************************************** array uniqued elements in array!<br>";
echo $ar[0]."<br>";
echo $ar[1]."<br>";
echo $ar[2]."<br>";
echo $ar[3]."<br>";
echo $ar[4]."<br>";
echo $ar[5]."<br>";
echo $ar[6]."<br>";
echo $ar[7]."<br>";
echo $ar[8]."<br>";
echo $ar[9]."<br>";
$p = 0;

for ($i=0;$i<=count($ar);$i++) {
 if (isset($ar[$i])) {$d[$p] = $ar[$i]; $p++;}
}

echo "************************************************** All elements in new array!<br>";
echo $d[0]."<br>";
echo $d[1]."<br>";
echo $d[2]."<br>";
echo $d[3]."<br>";
echo $d[4]."<br>";
echo $d[5]."<br>";
echo $d[6]."<br>";
echo $d[7]."<br>";
echo $d[8]."<br>";
echo $d[9]."<br>";

echo "**************************************************WHAT A %%%%???";
?>

Автор: Opik 27.3.2005, 09:16
Код

$val[0] = "1";
$val[1] = "1";
$val[2] = "1";
$val[3] = "2";
$val[4] = "3";
$val = array_unique($val);
$clean = array_merge($val);
var_dump($clean);

Автор: Gold Dragon 27.3.2005, 10:00
Я не супер в PHP, но может так
Код

//массив
$a = Array();
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";

//удаляем дуляж
$a=array_unique($a);

$b = Array();
$i = 0;

//прямой перебор
foreach ($a as $z1 => $z2)
{
$b[$i] = $z2;
$i++;
}

print_r($b);

Автор: VoAnt 27.3.2005, 11:01
Cупер! Всё работает 2Opr.

Автор: IZ@TOP 27.3.2005, 15:52
А не проще:

Код

$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";

$a = array_flip($a);
$a = array_keys($a);

Автор: Opik 27.3.2005, 17:10
IZ@TOP
чем проще чем у меня? так же 2 функции smile))

Автор: Gold Dragon 27.3.2005, 17:24
IZ@TOP
а что получается ?

Автор: IZ@TOP 27.3.2005, 18:05
Opr, у тебя лишняя переменная задейстована smile Я их экономлю smile
Добавлено @ 18:05
Red Dragon, а что? нет?
Добавлено @ 18:07
А вообще, если на то пошло, то лучше при получении данных заносить не как значения, а как ключи. Соответственно так как идентичных ключей не будет, мы получим уникальный набор значений.

Автор: IZ@TOP 27.3.2005, 18:17
Да, и вариант с ключами работает в три раза быстрее чем при использовании array_unique.

Автор: Irokez 27.3.2005, 18:21
IZ@TOP как проверял?

Автор: IZ@TOP 27.3.2005, 18:26
Irokez так:

Код

<pre>
<?php
function benchmark($begin, $scale = 3)
{
   $end   = explode(' ', microtime());
   $end   = array_sum($end);
   $begin = explode(' ', $begin);
   $begin = array_sum($begin);
   return round($end - $begin, $scale);
}

$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "п34етя";
$a[] = "с43ырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маш3а";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "пr43етя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вов34а";
$a[] = "ку23зя";
$a[] = "петя";
$a[] = "ма34ша";
$a[] = "пеr234тя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "во34ва";
$a[] = "кузя";
$a[] = "петя";
$a[] = "ма34ша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "пеt53tтя";
$a[] = "маша";
$a[] = "пеацукwwtтя";
$a[] = "сыцарожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "н54петя";
$a[] = "ман54ша";
$a[] = "пе8нццтя";
$a[] = "сн54ырожа";
$a[] = "вогва";
$a[] = "кун54зя";
$a[] = "пее2тя";
$a[] = "машвуц2ка";
$a[] = "пенц4тя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "петя";
$a[] = "маша";
$a[] = "петя";
$a[] = "сырожа";
$a[] = "вова";
$a[] = "кузя";
$a[] = "пе63тя";
$a[] = "ман5446реша";
$a[] = "п4545н64356путя";
$a[] = "сы4крожа";
$a[] = "во4н54ва";
$a[] = "к454ннкузя";
$a[] = "п53етя";
$a[] = "мн35аша";
$a[] = "пен45нтя";
$a[] = "с4кырожа";
$a[] = "вова";
$a[] = "ку23зя";
$a[] = "пе4тя";
$a[] = "машапку";
$a[] = "пепуктя";
$a[] = "сыпукац3рожа";
$a[] = "вокпук4ва";

$begin_a    = microtime();
$b    = array_flip($a);
$b    = array_keys($b);
$ba    = benchmark($begin_a, 6);
$begin_b    = microtime();
$a    = array_unique($a);
$b    = array_merge($a);
$bb    = benchmark($begin_b, 6);

echo "$ba - $bb";

?></pre>

Добавлено @ 18:28
И если массив увеличить раза в три-четыре, производительность вырастет в пять раз.
Добавлено @ 18:29
А если еще поменять это
Код

$b    = array_flip($a);
$b    = array_keys($b);

на это
Код

$b    = array_keys(array_flip($a));
то еще чуть быстрее.

Автор: Irokez 27.3.2005, 18:38
ну а если поменять оба варианта местами, то первое время будет также меньше второго

Автор: Irokez 27.3.2005, 18:59
кажется ты был прав:
Код

<pre>
<?php
function benchmark($begin, $scale = 3)
{
   $end   = explode(' ', microtime());
   $end   = array_sum($end);
   $begin = explode(' ', $begin);
   $begin = array_sum($begin);
   return round($end - $begin, $scale);
}
for($i=1; $i<=25000; $i++)
{
    $a[$i]='';
    for($j=1; $j<=100; $j++)
    {
        $r=rand(56, 90);
        $a[$i].=chr($r);
    }
}


$begin_a    = microtime();
$a    = array_unique($a);
$b    = array_merge($a);
$ba    = benchmark($begin_a, 6);
$begin_b    = microtime();
$b    = array_flip($a);
$b    = array_keys($b);
$bb    = benchmark($begin_b, 6);
echo "$ba - $bb";
?></pre>

Автор: IZ@TOP 27.3.2005, 19:33
Irokez, а я уже было начал сомневаться smile

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