回答:
次のことも実行できます。
$k = array_rand($array);
$v = $array[$k];
これは、連想配列がある場合に行う方法です。
array_rand()
、Mersenne Twisterジェネレーターを使用しています。rand()はmt_rand()にエイリアスされ、srand()はmt_srand()にエイリアスされています。実際にはこれで十分です。
PHPはそのための関数を提供しています:array_rand()
http://php.net/manual/en/function.array-rand.php
$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
array_rand
関数の2番目の引数のデフォルト値は1
、記述する必要はありません。
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;
}
array_rand
mt_rand
isset
ですか?とにかく、これは連想配列では失敗します。
mt_rand
がrand
、この場合の代わりに使用すると、他のアイテムよりもいくつかのアイテムを好むようです
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_rand
関数が大きな配列上の不均一な分布を持っているようだ、すべての配列項目を選ん取得することも同様に可能性がありません。配列でシャッフルを使用してから最初の要素を取得しても、この問題はありません。
$myArray = array(1, 2, 3, 4, 5);
// Random shuffle
shuffle($myArray);
// First element is random now
$randomValue = $myArray[0];
mt_rand()
は、おそらくタスクに適しています。
直接的な値を取得するために配列を反転することによる別のアプローチ。
スニペット
$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));
array_rand
値ではなくキーを返します。したがって、キーとして値を反転しています。
注: PHPキーは常に一意のキーであるため、配列を反転すると、キーとしての重複した値が上書きされます。
$array[array_rand($array)];
か?
array_flip
キーとして重複を削除してから 結果を出してください...重複はありません!
選択はセキュリティに影響しますか?その場合は、およびを使用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
ライナー:
echo $array[array_rand($array,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()
ため、この関数は問題なく使用してください。
私は@ÓlafurWaageの関数に基づいて答えを出しています。私はそれを使用しようとしましたが、戻りオブジェクトを変更しようとしたときに参照の問題に遭遇していました。私は彼の関数を更新して、参照によって渡したり戻ったりするようにしました。新しい関数は次のとおりです。
function &random_value(&$array, $default=null)
{
$k = mt_rand(0, count($array) - 1);
if (isset($array[$k])) {
return $array[$k];
} else {
return $default;
}
}
詳細については、質問を参照してください。オブジェクトへの参照を渡す/返す+オブジェクトの変更が機能しません
次のように配列から乱数を取得します。
$randomValue = $rand[array_rand($rand,1)];
array_rand
、ランダムではありません