web-dev-qa-db-ja.com

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

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

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

110
Roland

次のこともできます。

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

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

211
reko_t

PHPは、そのための関数array_Rand()を提供します
http://php.net/manual/en/function.array-Rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_Rand($ran, 1)];
30
NDM

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;
}
21
Ólafur Waage
$value = $array[array_Rand($array)];
19
KAS

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)];
13
Jake

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']

いくつかのメモ:

  • $amountcount($array)以下でなければなりません。
  • array_Rand()はキーをシャッフルしません(PHP 5.2.10から 48224 を参照)。したがって、選択したアイテムは常に元の順序になります。必要に応じて、後でshuffle()を使用します。


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


edit:Laravel関数はそれ以降著しく成長しました。Laravel 5.4 'を参照してくださいs 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
10
Gras Double

array_Rand関数は、大きな配列で不均一な分布を持っているようです。すべての配列項目が等しく選択される可能性があるわけではありません。配列で shuffle を使用してから最初の要素を取得しても、この問題は発生しません。

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

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];
8
Asciiom
$Rand = Rand(1,4);

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

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

配列を反転させて直接価値を得る別のアプローチ。

スニペット

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

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

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

3
Smartpal

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

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

選択内容にセキュリティ上の影響はありますか?その場合は、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

私の場合、オブジェクトである2つの値を取得する必要があります。このシンプルなソリューションを共有します。

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

これはインライン配列でうまく機能します。さらに、関数でラップすると物事が整頓され、再利用可能になると思います。

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
rinogo

@Ó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
Jeff

1行:$ran[Rand(0, count($ran) - 1)]

0
Abdelilah