配列からランダムな値を取得する方法は?


123

という配列があります $ran = array(1,2,3,4);

この配列からランダムな値を取得して変数に格納する必要があります。これを行うにはどうすればよいですか?

回答:


232

次のことも実行できます。

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

これは、連想配列がある場合に行う方法です。


11
このコメントに よるとarray_rand、ランダムではありません
Timo Huovinen

1
または、このパッケージを要求し使用することができますarray_rand_value
2015年

10
PHP 7.1以降array_rand()、Mersenne Twisterジェネレーターを使用しています。rand()はmt_rand()にエイリアスされ、srand()はmt_srand()にエイリアスされています。実際にはこれで十分です。
Gras Double


23

mt_rand()を使用できます

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

これは、値が必要な場合に関数としても役立ちます。

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

4
アイテムは4つしかないため、mt_rand(0、3)にする必要があります。より正確には:$ array [mt_rand(0、count($ array)]
reko_t

2
エラー、mt_rand(0、count($ ran)-1)を意味していると思います
Josh Davis

array_randmt_rand
PHPの

1
全体のポイントは何issetですか?とにかく、これは連想配列では失敗します。
ルーク・カズンズ

理由はわかりませんmt_randrand、この場合の代わりに使用すると、他のアイテムよりもいくつかのアイテムを好むようです
user151496


14

以下のように、array_rand関数を使用して、配列からランダムなキーを選択できます。

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

または、ランダム関数を選択するためにrand関数とcount関数を使用できます。

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

11

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

使用法:

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

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

いくつかのメモ:

  • $amount 以下である必要があります count($array)ます。
  • array_rand()はキーをシャッフルしません(PHP 5.2.10以降、48224を参照)。そのため、選択したアイテムは常に元の順序になります。shuffle()後で必要に応じて使用してください。


ドキュメント:array_rand()shuffle()


編集: Laravel関数はそれ以来著しく成長しました。Laravel5.4を参照してくださいArr::random()。これは、大人のLaravel関数から派生した、より複雑なものです。

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

いくつかのハイライト:

  • 十分なアイテムがない場合は例外をスローします
  • array_random($array, 1)1つのアイテムの配列を返します(#19826
  • アイテム数のサポート値「0」(#20439

8

array_rand関数が大きな配列上の不均一な分布を持っているようだ、すべての配列項目を選ん取得することも同様に可能性がありません。配列でシャッフルを使用してから最初の要素を取得しても、この問題はありません。

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

// Random shuffle
shuffle($myArray);

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

ただし、これは、単一のランダム要素を取得するためだけの追加の計算「作業」です。使用する他の回答mt_rand()は、おそらくタスクに適しています。
rinogo

あなたのニーズが何であるかによると思います。私の場合、分散は非常に重要であり、計算のオーバーヘッドはそうではありませんでした。
Asciiom

5

直接的な値を取得するために配列を反転することによる別のアプローチ。

スニペット

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

array_rand値ではなくキーを返します。したがって、キーとして値を反転しています。

注: PHPキーは常に一意のキーであるため、配列を反転すると、キーとしての重複した値が上書きされます。


なぜしないのです$array[array_rand($array)];か?
rinogo 19/12/20

@rinogoそれも動作します、これはすでに上記で回答しました。これはあなたの答えとは少し異なります。array_flipキーとして重複を削除してから 結果を出してください...重複はありません!
Smartpal

4
$rand = rand(1,4);

または、特に配列の場合:

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

2
このリストの最初の項目を取得することはありませんでしょう、あなたは4でアレイの外側に行くだろう
オラフルWaage

最初の$ randは値です。元の配列は、第二の$ランドが配列のキー、0〜3程度である1から4までの範囲の値を有する
ジョシュデービス

3

私の場合、オブジェクトである2つの値を取得する必要があります。この簡単な解決策を共有します。

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

2

選択はセキュリティに影響しますか?その場合は、およびを使用random_int()してくださいarray_keys()。(random_bytes()PHP 7のみですが、PHP 5のポリフィルがあります)。

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

使用法:

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

デモ:https : //3v4l.org/1joB1


2

rand()を使用して乱数を取得し、ランダムなキーをエコーし​​ます。例:0-3

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


2

短い配列には1行のバージョンが必要でした。

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

または配列が固定されている場合:

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

2

ライナー:

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

このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
β.εηοιτ.βε

1

これはインライン配列でうまく機能します。さらに、私は物事がきちんと整理されていて、関数にラップされたほうが再利用可能だと思います。

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

使用法:

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

PHP <7.1.0では、をarray_rand()使用rand()しているため、セキュリティや暗号化に関連するものについてはこの関数を使用したくないでしょう。PHP 7.1.0以降でrand()は、にエイリアスされているmt_rand()ため、この関数は問題なく使用してください


0

私は@ÓlafurWaageの関数に基づいて答えを出しています。私はそれを使用しようとしましたが、戻りオブジェクトを変更しようとしたときに参照の問題に遭遇していました。私は彼の関数を更新して、参照によって渡したり戻ったりするようにしました。新しい関数は次のとおりです。

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

詳細については、質問を参照してください。オブジェクトへの参照を渡す/返す+オブジェクトの変更が機能しません


0

Arrayからランダム値を取得する簡単な方法。

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

今度は、毎回Arrayから異なる色を取得します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.