Получите подмножество случайных значений из массива php

Начиная с массива с значениями 10K. Я хочу случайным образом получить 1000 значений и поместить их в другой массив.

Прямо сейчас, я использую цикл for для получения значений, но я хочу выбрать 1000 значений и не зацикливаться на 1000 раз. Функция array_slice работает, но не дает случайных значений. Какова правильная (наиболее эффективная) функция для этой задачи.

Код прямо сейчас

$seedkeys = (...array.....); for ($i=0; $i<1000; $i++) { $random = array_rand($seedkeys); $randseed[$i] = $seedkeys[$random]; }//for close 

ТИА

Ну, есть несколько альтернатив. Я не уверен, что самый быстрый, поскольку вы имеете дело с массивным массивом, но вы можете попробовать их:

Вы можете использовать shuffle , который будет рандомизировать весь массив. Это, вероятно, будет иметь лучшую производительность, так как вы потребляете значительную часть массива (10%).

 shuffle($seedkeys); $result = array_slice($seedkeys, 0, 1000); 

Вы можете использовать array_rand (как вы уже сказали) в усадьбе, которую указывает Том Хей. Это потребует копирования ключей, поэтому, если вы имеете дело со значительной частью исходного массива, это может быть не самым быстрым. (Обратите внимание на использование array_flip , необходимо разрешить использование array_intersect_key :

 $keys = array_flip(array_rand($seedkeys, 1000)); $result = array_intersect_key($seedkeys, $keys); 

Если память плотная, лучшим решением (помимо MySQL) будет цикл, так как он не требует копирования массивов вообще. Обратите внимание, что это будет медленнее, но если массив содержит много информации, он может компенсировать медленность благодаря большей эффективности памяти (поскольку он только копирует именно то, что он возвращает) …

 $result = array(); for ($i = 0; $i < 1000; $i++) { $result[] = $seedkeys[array_rand($seedkeys)]; } 

Вы можете сделать это в MySQL (предполагая, что данные для массива начинаются с MySQL). Помните, что это просто, но не так эффективно (см. Сообщение Джона Кнешке ) …

 SELECT * FROM `foo` ORDER BY RAND() LIMIT 1000; 

Вы можете использовать array_rand() для получения нескольких элементов?

 $random_keys = array_rand($seedkeys, 1000); shuffle($random_keys); 

Это даст вам массив случайных ключей, поэтому для получения массива значений вам нужно сделать что-то вроде этого:

 $result = array(); foreach ($random_keys as $rand_key) { $result[] = $seedkeys[$rand_key]; } 

Вместо этого вы можете использовать array_intersect_key() :

 $result = array_intersect_key($seedkeys, array_flip($random_keys));