Странное поведение php array_unique

334
03 июня 2017, 17:47
$arr = array();
for ($i = 0; $i < 50000; $i++) {
    $arr[$i] = rand(1, 100000);
}
echo"Элементов в исходном массиве:";
print_r(count($arr));
//массив уникальных элементов
$arrOfUnic = array_unique($arr);
echo"Элементов в массиве после удаления дублей:";
print_r(count($arrOfUnic));
echo"случайный элемент:";
$randomIndex = array_rand($arrOfUnic);
print_r($randomIndex);
echo"=>";
print_r($arrOfUnic[$randomIndex]);

Всегда один и тот же результат: Элементов в исходном массиве: 50000 Элементов в массиве после удаления дублей: 32768 случайный элемент: 15535=>79545. Если массив

for ($i = 0; $i < 17000; $i++) {
$arr[$i] = rand(1, 25000);
}

По кругу выдается 3 результата:

Элементов в массиве после удаления дублей: 14917 случайный элемент: 2118=>23979

Элементов в массиве после удаления дублей: 14943 случайный элемент: 13481=>23870

Элементов в массиве после удаления дублей: 14878 случайный элемент: 268=>12020

Answer 1

По своему опыту скажу что функция rand генерирует числа ужасно, и с этим ничего не делалось, только в версии 7.1 её уже убрали и оставили как алиас на функцию mt_rand.

Если вы используете версию PHP ниже 7.1, то рекомендую как раз использовать именно функцию mt_rand, дублей должно быть меньше, потому что используется алгоритм: Mersenne Twister Random Number Generator. К тому же ходили слухи что она в разы быстрее чем rand (хотя на самом деле прирост скорости не особо заметен).

UPD. Как альтернативу array_rand могу посоветовать вот такой код, говорят что даже он быстрее и лучше:

$a = ['http://php.net/', 'http://google.com/', 'http://bbc.co.uk/'];
$website = $a[mt_rand(0, count($a) - 1)];

Источник

READ ALSO
Вывод данных из массива json

Вывод данных из массива json

Есть json с данными, как в массиве stats выбрать нужную запись по name? json_decode($urljson)->playerstats->stats[0] не подходит, так как данные могут отличаться местами

425
Как делать escape?

Как делать escape?

Каким образом делается эскейпинг входящих post-данных в orm phpactiverecordЭто нужно делать своими силами или ?

337
Отправка HTML кода из Texarea

Отправка HTML кода из Texarea

ИтакЕсть некий скрипт, часть из которого приведена ниже, который отправляет HTML код из поля <textarea>:

379