php получить два разных случайных элемента массива

Из массива

 $my_array = array('a','b','c','d','e');

Я хочу получить два РАЗНЫХ случайных элемента.

Со следующим кодом:

 for ($i=0; $i<2; $i++) {
    $random = array_rand($my_array);  # one random array element number
    $get_it = $my_array[$random];    # get the letter from the array
    echo $get_it;
 }

можно получить два раза одно и то же письмо. Мне нужно предотвратить это. Я хочу всегда получать два разных элемента массива. Может кто-нибудь сказать мне, как это сделать? Спасибо


person creativz    schedule 24.02.2010    source источник


Ответы (7)


Вы всегда можете удалить элемент, который вы выбрали в первый раз, тогда вы не выберете его снова. Если вы не хотите изменять массив, создайте копию.

 for ($i=0; $i<2; $i++) {
    $random = array_rand($my_array);  # one random array element number
    $get_it = $my_array[$random];    # get the letter from the array
    echo $get_it;

    unset($my_array[$random]);
 }
person pheelicks    schedule 24.02.2010
comment
Зачем использовать цикл? Почему бы просто не получить первое случайное значение, удалить его из массива, а затем получить второе? Вторую удалять не нужно. - person Adam Hopkinson; 24.02.2010
comment
Я использовал цикл, потому что это означало минимальные изменения в коде creativz. Кроме того, это упрощает расширение кода для выбора произвольного количества элементов. - person pheelicks; 24.02.2010

array_rand() может принимать два параметра: массив и количество (разных) элементов, которые вы хотите выбрать.

mixed array_rand ( array $input [, int $num_req = 1 ] )
$my_array = array('a','b','c','d','e');
foreach( array_rand($my_array, 2) as $key ) {
  echo $my_array[$key];
}
person VolkerK    schedule 24.02.2010
comment
Мне нравится этот. Однако, судя по комментариям на php.net, порядок возвращаемых индексов не такой уж и случайный. +1 в любом случае ;) - person middus; 24.02.2010
comment
@middus: это все еще верно для последних версий php? Было много жалоб на некоторые случайные функции, особенно. на вин32. Я думал, что они были (несколько) исправлены. - person VolkerK; 24.02.2010
comment
Я не знаю. Я не проверял это сам. - person middus; 24.02.2010

Как насчет этого?

$random = $my_array; // make a copy of the array
shuffle($random); // randomize the order
echo array_pop($random); // take the last element and remove it
echo array_pop($random); // s.a.
person middus    schedule 24.02.2010
comment
Для очень больших массивов это может быть довольно медленным, хотя вам, конечно же, не нужно перетасовывать весь массив только для того, чтобы получить два элемента. - person Joey; 24.02.2010
comment
Это не было частью спецификации ;). - person middus; 24.02.2010

вот простая функция, которую я использую для извлечения нескольких случайных элементов из массива.

function get_random_elements( $array, $limit=0 ){

    shuffle($array);

    if ( $limit > 0 ) {
        $array = array_splice($array, 0, $limit);
    }

    return $array;
}
person jbrahy    schedule 07.05.2014

Вы можете перетасовать, а затем выбрать кусок из двух. Используйте другую переменную, если хотите сохранить исходный массив нетронутым.

$your_array=[1,2,3,4,5,6,7];
shuffle($your_array); // randomize the order
$your_array = array_slice($your_array, 0, 2); //pick 2
person Selay    schedule 17.08.2018

Вот как я это сделал. Надеюсь, это поможет кому-то запутаться.

$originalArray = array( 'first', 'second', 'third', 'fourth' );
$newArray= $originalArray;
shuffle( $newArray);
for ($i=0; $i<2; $i++) {
  echo $newArray[$i];
}
person Gwapedwink    schedule 06.12.2017

Получите первое случайное число, затем используйте цикл do..while, чтобы получить второе:

$random1 = array_rand($my_array);
do {
    $random2 = array_rand($my_array);
} while($random1 == $random2);

Это будет продолжаться до тех пор, пока random2 не будет таким же, как random1.

person Adam Hopkinson    schedule 24.02.2010
comment
@pheelicks Это должно работать, потому что array_rand возвращает индекс, а не сам элемент. - person middus; 24.02.2010
comment
Это не самое изящное решение (мои деньги на миддусе), но оно работает. Любые комментарии/причины от downvoters? - person Adam Hopkinson; 24.02.2010