2010-09-03 2 views
4

У меня есть массив объектов в PHP. Мне нужно выбрать 8 из них наугад. Моя первоначальная мысль заключалась в использовании array_rand(array_flip($my_array), 8), но это не работает, потому что объекты не могут действовать как ключи для массива.Как выбрать случайные значения из массива в PHP?

Я знаю, что могу использовать shuffle, но я беспокоюсь о производительности по мере роста размера массива. Это лучший способ, или есть более эффективный способ?

+0

Те 8 должно быть уникальным? – kennytm

+0

Да, они должны быть уникальными. –

ответ

8
$result = array(); 
foreach(array_rand($my_array, 8) as $k) { 
    $result[] = $my_array[$k]; 
} 
2

Вы можете использовать array_rand подобрать ключи случайным образом и foreach, чтобы собрать объекты:

$objects = array(); 
foreach (array_rand($my_array, 8) as $key) { 
    $objects[] = $my_array[$key]; 
} 
+0

Потому что он возвращает ключи массива, а не значения? –

+1

@Chris, поэтому вы используете '$ my_array [$ key]'. – eyelidlessness

+0

@Chris B .: Я перефразировал свой ответ. :) – Gumbo

0

Что о ?:

$count = count($my_array); 
for ($i = 0; $i < 8; $i++) { 
    $x = rand(0, $count); 
    $my_array[$x]; 
}
+0

это не будет работать с ассоциативными массивами – tamasd

5
$array = array(); 
shuffle($array); // randomize order of array items 
$newArray = array_slice($array, 0, 8); 

Обратите внимание, что функция дает shuffle() параметр в качестве ссылки и вносит изменения в него.

+1

Loop free. Это прекрасное решение. – Chords

+1

@Chords Вы можете поспорить, что 'shuffle' и' array_slice' содержат немного циклов. :) –

+0

Touche, но, по крайней мере, мне не нужно смотреть на это! – Chords

0

Я только что нашел это в коде и в надежде найти более читаемым решение:

$rand = array_intersect_key($all, array_flip(array_rand($all, $count))); 
Смежные вопросы