Tengo un array llamado $ran = array(1,2,3,4);

Necesito para obtener un valor aleatorio de esta matriz y la almacenamos en una variable, ¿cómo puedo hacer esto?

InformationsquelleAutor Roland | 2009-10-29

16 Comentarios

  1. 21

    Puede utilizar mt_rand()

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

    Esto es útil como una función, así que si usted necesita el valor

    function random_value($array, $default=null)
    {
        $k = mt_rand(0, count($array) - 1);
        return isset($array[$k])? $array[$k]: $default;
    }
    • Debe ser mt_rand(0, 3) como sólo hay 4 artículos. Más correctamente, sin embargo: $array[mt_rand(0, count($array)]
    • Err, creo que significaba mt_rand(0, count($ran) – 1)
    • Sí, lo hice, buena captura. 😛
    • de acuerdo con php comentarios array_rand no es tan aleatorio como debe ser, por lo mt_rand es preferido
    • ¿Cuál es el punto en el conjunto de la isset parte? Esto produciría un error de matrices asociativas de todos modos.
    • no sé por qué, pero cuando se utiliza mt_rand en lugar de rand en este caso parece preferir algunos elementos más que los otros
    • desde PHP 7.1 array_rand usos de Mersenne Twister algoritmo php.net/manual/en/function.array-rand.php

  2. 12

    Podría utilizar el array_rand función para seleccionar una clave aleatoria a partir de su matriz como la siguiente.

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

    o usted podría 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)];
  3. 10

    Derivados de Laravel Colección::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']

    Un par de notas:

    • $amount tiene que ser menor o igual a count($array).
    • array_rand() no shuffle claves (desde PHP 5.2.10, ver Cuarenta y ocho mil doscientos veinticuatro), por lo que sus artículos seleccionados será siempre en el orden original. Uso shuffle() después si es necesario.


    Documentación: array_rand(), shuffle()


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

    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 puntos destacados:

    • Lanzar la excepción si no hay suficientes elementos disponibles
    • array_random($array, 1) devuelve un array de un elemento (#19826)
    • Apoyo a valor «0» para el número de elementos (#20439)
  4. 8

    La array_rand función parece tener una distribución desigual en las matrices grandes, no cada elemento de matriz es igual de probable que la escojan. El uso de shuffle en la matriz y, a continuación, tomar 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];
    • Eso es un montón de extra computacional «trabajo» sólo para obtener un único elemento aleatorio, aunque. Las otras respuestas que utilizan mt_rand() son probablemente las más adecuadas para la tarea.
    • Depende de cuáles son tus necesidades, supongo. En mi caso, la distribución fue muy importante y el cómputo de la sobrecarga no.
  5. 4
    $rand = rand(1,4);

    o, para las matrices específicamente:

    $array = array('a value', 'another value', 'just some value', 'not some value');
    $rand = $array[ rand(0, count($array)-1) ];
    • Usted nunca llegaría el primer elemento de esta lista y va a ir fuera de la matriz con 4
    • Los primeros $rand es acerca de los valores. La matriz original tiene valores que van de 1 a 4. El segundo $rand es acerca de las claves del array, de 0 a 3.
  6. 3

    Otro enfoque a través de voltear la matriz para obtener el valor directo.

    Fragmento de

    $array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
    $val = array_rand(array_flip($array));

    array_rand tecla de retorno, no de valor. Por lo tanto, estamos volteando valor como clave.

    Nota:
    PHP clave siempre será una clave única, por lo que cuando la matriz es volteado, duplicar el valor de una clave será sobrescrito.

    • ¿Por qué no hacer $array[array_rand($array)];?
    • Se trabaja demasiado, Este ya se haya respondido anteriormente. Este es un poco diferente de su respuesta, array_flip eliminar duplicados como clave, a continuación, dar resultado… Significa que no hay duplicados!
  7. 2

    Hace su selección de las implicaciones de seguridad? Si es así, utilice random_int() y array_keys(). (random_bytes() es PHP 7 sólo, pero hay un polyfill para 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]]);

    Demo: https://3v4l.org/1joB1

  8. 2

    El uso de la función rand() para obtener el número aleatorio para eco clave aleatoria. En ex: 0 – 3

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

    En mi caso, tengo 2 valores ¿cuáles son los objetos. Comparto esta sencilla solución.

    $ran = array("a","b","c","d");
    $ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));
  10. 0

    Me estoy basando mi respuesta de @ÓlafurWaage de la función. He intentado usarlo pero se estaba ejecutando en problemas de referencia cuando yo había tratado de modificar el objeto de devolución. He actualizado su función de pasar y devolver 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 más contexto, ver a mi pregunta sobre en Pasar/Devolución de las referencias a objetos + cambio de objeto no está funcionando

  11. 0

    Esto va a funcionar muy bien en línea con las matrices. Además, creo que las cosas son más ordenado y más reutilizable, cuando envuelto en una función.

    function array_rand_value($a) {
        return $a[array_rand($a)];
    }

    Uso:

    array_rand_value(array("a", "b", "c", "d"));

    En PHP < 7.1.0, array_rand() utiliza rand(), por lo que no desea esta función para cualquier cosa relacionada con la seguridad o la criptografía. En PHP 7.1.0+, el uso de esta función sin preocupación, ya que rand() se ha suavizado a mt_rand().

  12. -5

    De obtener un número aleatorio de una matriz como la siguiente:

    $randomValue = array_rand($rand,1);
    • array_rand() devuelve una clave aleatoria, no es un valor aleatorio.

Dejar respuesta

Please enter your comment!
Please enter your name here