Elitmiar
Elitmiar

Reputation: 36899

How to get random value out of an array?

I have an array called $ran = array(1,2,3,4);

I need to get a random value out of this array and store it in a variable, how can I do this?

Upvotes: 160

Views: 233836

Answers (21)

Hebe
Hebe

Reputation: 810

mt_srand usage example

if one needs to pick a random row from a text but same all the time based on something

$rows = array_map('trim', explode("\n", $text));
mt_srand($item_id);
$row = $rows[rand(0, count($rows ) - 1)];

Upvotes: 0

dipenparmar12
dipenparmar12

Reputation: 3495

Get random values from an array.

function random($array)
{
    /// Determine array is associative or not
    $keys = array_keys($array);
    $givenArrIsAssoc = array_keys($keys) !== $keys;

    /// if array is not associative then return random element
    if(!$givenArrIsAssoc){
        return $array[array_rand($array)];
    }

    /// If array is associative then 
    $keys = array_rand($array, $number);
    $results = [];
    foreach ((array) $keys as $key) {
        $results[] = $array[$key];
    }
    return $results;
}

Upvotes: 0

Sid
Sid

Reputation: 4510

On-liner:

echo $array[array_rand($array,1)]

Upvotes: 7

Adam Libonatti-Roche
Adam Libonatti-Roche

Reputation: 321

You get a random number out of an array as follows:

$randomValue = $rand[array_rand($rand,1)];

Upvotes: -5

pankaj
pankaj

Reputation: 1914

A simple way to getting Randdom value form Array.

$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)

now every time you will get different colors from Array.

Upvotes: -1

Rafael
Rafael

Reputation: 346

I needed one line version for short array:

($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]

or if array is fixed:

[1, 2, 3, 4][mt_rand(0, 3]

Upvotes: 3

CN Lee
CN Lee

Reputation: 134

In my case, I have to get 2 values what are objects. I share this simple solution.

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

Upvotes: 4

rinogo
rinogo

Reputation: 9163

This will work nicely with in-line arrays. Plus, I think things are tidier and more reusable when wrapped up in a function.

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

Usage:

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

On PHP < 7.1.0, array_rand() uses rand(), so you wouldn't want to this function for anything related to security or cryptography. On PHP 7.1.0+, use this function without concern since rand() has been aliased to mt_rand().

Upvotes: 3

Abdelilah
Abdelilah

Reputation: 37

One line: $ran[rand(0, count($ran) - 1)]

Upvotes: 3

Shahnawaz Kadari
Shahnawaz Kadari

Reputation: 1571

Another approach through flipping array to get direct value.

Snippet

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

array_rand return key not value. So, we're flipping value as key.

Note: PHP key alway be an unique key, so when array is flipped, duplicate value as a key will be overwritten.

Upvotes: 14

Gras Double
Gras Double

Reputation: 16383

Derived from 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;
}

Usage:

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

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

A few notes:

  • $amount has to be less than or equal to count($array).
  • array_rand() doesn't shuffle keys (since PHP 5.2.10, see 48224), so your picked items will always be in original order. Use shuffle() afterwards if needed.


Documentation: array_rand(), shuffle()


edit: The Laravel function has noticeably grown since then, see Laravel 5.4's Arr::random(). Here is something more elaborate, derived from the grown-up Laravel function:

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;
}

A few highlights:

  • Throw exception if there are not enough items available
  • array_random($array, 1) returns an array of one item (#19826)
  • Support value "0" for the number of items (#20439)

Upvotes: 13

Muhammad Ibnuh
Muhammad Ibnuh

Reputation: 410

Use rand() to get random number to echo random key. In ex: 0 - 3

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

Upvotes: 2

TURTLE
TURTLE

Reputation: 3847

You could use the array_rand function to select a random key from your array like below.

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

or you could use the rand and count functions to select a random index.

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

Upvotes: 20

Scott Arciszewski
Scott Arciszewski

Reputation: 34123

Does your selection have any security implications? If so, use random_int() and array_keys(). (random_bytes() is PHP 7 only, but there is a 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];
}

Usage:

$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

Upvotes: 2

Jeff
Jeff

Reputation: 14279

I'm basing my answer off of @ÓlafurWaage's function. I tried to use it but was running into reference issues when I had tried to modify the return object. I updated his function to pass and return by reference. The new function is:

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

For more context, see my question over at Passing/Returning references to object + changing object is not working

Upvotes: 0

KAS
KAS

Reputation: 820

$value = $array[array_rand($array)];

Upvotes: 30

&#211;lafur Waage
&#211;lafur Waage

Reputation: 70021

You can use mt_rand()

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

This comes in handy as a function as well if you need the value

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

Upvotes: 24

Asciiom
Asciiom

Reputation: 9975

The array_rand function seems to have an uneven distribution on large arrays, not every array item is equally likely to get picked. Using shuffle on the array and then taking the first element doesn't have this problem:

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

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];

Upvotes: 10

NDM
NDM

Reputation: 6840

PHP provides a function just for that: array_rand()
http://php.net/manual/en/function.array-rand.php

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

Upvotes: 41

reko_t
reko_t

Reputation: 56450

You can also do just:

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

This is the way to do it when you have an associative array.

Upvotes: 284

Duroth
Duroth

Reputation: 6581

$rand = rand(1,4);

or, for arrays specifically:

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

Upvotes: 6

Related Questions