2009-10-29 14 views

Respuesta

161

También se puede hacer simplemente:

$k = array_rand($array); 
$v = $array[$k]; 

Este es la forma de hacerlo cuando tienes una matriz asociativa.

+9

según este [comentario] (http://www.php.net/manual/en/function.array-rand.php#105265) 'array_rand' no es tan aleatorio como debería ser –

+0

O puede requerir [este paquete] (https://github.com/freekmurze/array-functions) y use 'array_rand_value' – murze

+2

Desde PHP 7.1, [' array_rand() '] (http://php.net/manual/en/function.array -rand.php) utiliza el generador Mersenne Twister: [rand() con alias a mt_rand() y srand() con alias a mt_srand()] (http://php.net/manual/en/migration71.incompatible.php#migration71 .incompatible.rand-srand-aliases). En la práctica, ahora debería ser lo suficientemente bueno. –

16

Puede utilizar mt_rand()

$random = $ran[mt_rand(0, count($ran) - 1)]; 

Esto viene muy bien como una función, así si necesita el valor

function random_value($array, $default=null) 
{ 
    $k = mt_rand(0, count($array) - 1); 
    return isset($array[$k])? $array[$k]: $default; 
} 
+4

Debe ser mt_rand (0, 3) ya que solo hay 4 elementos. Más correctamente sin embargo: $ array [mt_rand (0, count ($ array)] –

+2

Err, creo que quiso decir mt_rand (0, count ($ ran) - 1) –

+0

Sí lo hice, buena captura.: P –

3
$rand = rand(1,4); 

o, para las matrices en concreto:

$array = array('a value', 'another value', 'just some value', 'not some value'); 
$rand = $array[ rand(0, count($array)-1) ]; 
+2

Nunca se obtendría el primer elemento en esta lista y se saldría de la matriz con 4 –

+0

El primer $ rand se trata de valores. El conjunto original tiene valores que van del 1 al 4. El segundo $ rand se trata de las teclas de matriz, de 0 a 3. –

-5

obtienes un n aleatorio úmero de una matriz como sigue:

$randomValue = array_rand($rand,1); 
+3

array_rand() devuelve una clave aleatoria, no un valor aleatorio. –

19

PHP proporciona una función sólo por eso: array_rand()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4); 
$randomElement = $ran[array_rand($ran, 1)]; 
+0

El valor predeterminado del segundo argumento de la función 'array_rand' es' 1', por lo que no es necesario escribirlo. –

7

Puede usar la función array_rand para seleccionar una clave aleatoria de su matriz como se muestra a continuación.

$array = array("one", "two", "three", "four", "five", "six"); 
echo $array[array_rand($array, 1)]; 

o puede utilizar el rand y el recuento de funciones para seleccionar un índice aleatorio.

$array = array("one", "two", "three", "four", "five", "six"); 
echo $array[rand(0, count($array) - 1)]; 
6

La función array_rand parece tener una distribución desigual en grandes series, no cada elemento de la matriz es la misma probabilidad de ser recogido. Usando shuffle en la matriz y luego tomando el primer elemento no tiene este problema:

$myArray = array(1, 2, 3, 4, 5); 

// Random shuffle 
shuffle($myArray); 

// First element is random now 
$randomValue = $myArray[0]; 
12
$value = $array[array_rand($array)]; 
0

Estoy basando mi respuesta fuera de la función de @ ÓlafurWaage. Intenté usarlo pero me encontré con problemas de referencia cuando intenté modificar el objeto de devolución. Actualicé su función para pasar y regresar por referencia.La nueva función es:

function &random_value(&$array, $default=null) 
{ 
    $k = mt_rand(0, count($array) - 1); 
    if (isset($array[$k])) { 
     return $array[$k]; 
    } else { 
     return $default; 
    } 
} 

Para obtener más contexto, véase mi pregunta sobre al Passing/Returning references to object + changing object is not working

4

Derivado de laravel Collection::random():

function array_random($array, $amount = 1) 
{ 
    $keys = array_rand($array, $amount); 

    if ($amount == 1) { 
     return $array[$keys]; 
    } 

    $results = []; 
    foreach ($keys as $key) { 
     $results[] = $array[$key]; 
    } 

    return $results; 
} 

Uso:

$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum']; 

array_random($items); // 'bar' 
array_random($items, 2); // ['foo', 'ipsum'] 

Unas pocas notas :

  • $amount tiene que ser menor que o igual a count($array).
  • array_rand() no baraja las teclas (desde PHP 5.2.10, consulte 48224), por lo que sus elementos seleccionados siempre estarán en el orden original. Use shuffle() después si es necesario.


Documentación: array_rand(), shuffle()


edición: La función laravel ha crecido notablemente desde entonces, ver laravel 5.4 de Arr::random(). Aquí es algo más elaborado, derivada de la función laravel adulta:

function array_random($array, $number = null) 
{ 
    $requested = ($number === null) ? 1 : $number; 
    $count = count($array); 

    if ($requested > $count) { 
     throw new \RangeException(
      "You requested {$requested} items, but there are only {$count} items available." 
     ); 
    } 

    if ($number === null) { 
     return $array[array_rand($array)]; 
    } 

    if ((int) $number === 0) { 
     return []; 
    } 

    $keys = (array) array_rand($array, $number); 

    $results = []; 
    foreach ($keys as $key) { 
     $results[] = $array[$key]; 
    } 

    return $results; 
} 

Algunos aspectos destacados:

  • excepción del tiro si no hay suficientes elementos disponibles
  • array_random($array, 1) devuelve una matriz de una artículo (#19826)
  • valor de Soporte "0" para el número de elementos (#20439)
2

¿Tiene su selección alguna implicancia de seguridad? Si es así, use random_int() y array_keys(). (random_bytes() es solo PHP 7, pero hay un polyfill for PHP 5).

function random_index(array $source) 
{ 
    $max = count($source) - 1; 
    $r = random_int(0, $max); 
    $k = array_keys($source); 
    return $k[$r]; 
} 

Uso:

$array = [ 
    'apple' => 1234, 
    'boy' => 2345, 
    'cat' => 3456, 
    'dog' => 4567, 
    'echo' => 5678, 
    'fortune' => 6789 
]; 
$i = random_index($array); 
var_dump([$i, $array[$i]]); 

Demostración: https://3v4l.org/1joB1

-4

Otra alternativa con pura MySQL:

$result = mysql_query("select group_id from menu_groups 
     group by group_id 
     order by rand() 
     limit 1"); 

$rand_group= mysql_fetch_row($result); 
$rand_group_id= $rand_group['group_id']; 
+1

Creo que malinterpretaste la pregunta. Pide un elemento aleatorio de la matriz php, no el registro de la base de datos. – zennin

1

Uso rand() para obtener números aleatorios para hacerse eco clave aleatoria. En ex: 0 - 3

$ran = array(1,2,3,4); 
echo $ran[rand(0,3)]; 
Cuestiones relacionadas