ฉันมีอาร์เรย์ที่เรียกว่า $ran = array(1,2,3,4);
ฉันต้องการรับค่าสุ่มจากอาร์เรย์นี้และเก็บไว้ในตัวแปรฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีอาร์เรย์ที่เรียกว่า $ran = array(1,2,3,4);
ฉันต้องการรับค่าสุ่มจากอาร์เรย์นี้และเก็บไว้ในตัวแปรฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คุณยังสามารถทำได้เพียง:
$k = array_rand($array);
$v = $array[$k];
นี่คือวิธีที่ต้องทำเมื่อคุณมีอาร์เรย์เชื่อมโยง
array_rand_value
array_rand()
ใช้ Mersenne Twister กำเนิด: แรนด์ () นามแฝง 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
ฟังก์ชัน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
ในกรณีนี้ดูเหมือนว่าจะชอบบางรายการมากกว่ารายการอื่น
$value = $array[array_rand($array)];
คุณสามารถใช้ฟังก์ชัน array_rand เพื่อเลือกคีย์สุ่มจากอาร์เรย์ของคุณดังด้านล่าง
$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];
หรือคุณสามารถใช้ฟังก์ชัน Rand and count เพื่อเลือกดัชนีแบบสุ่ม
$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];
มาจาก 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 ได้เติบโตขึ้นอย่างเห็นได้ชัดตั้งแต่นั้นมาดู Laravel Arr::random()
5.4 นี่คือสิ่งที่ซับซ้อนมากขึ้นซึ่งได้มาจากฟังก์ชัน 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
ลบรายการที่ซ้ำกันเป็นคีย์จากนั้นให้ผลลัพธ์ ... หมายความว่าไม่ซ้ำกัน!
$rand = rand(1,4);
หรือสำหรับอาร์เรย์โดยเฉพาะ:
$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];
ในกรณีของฉันฉันต้องได้รับ 2 ค่าสิ่งที่เป็นวัตถุ ฉันแบ่งปันวิธีง่ายๆนี้
$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));
การเลือกของคุณมีผลกระทบด้านความปลอดภัยหรือไม่? ถ้าเป็นเช่นนั้นให้ใช้random_int()
และarray_keys()
. ( random_bytes()
เป็น PHP 7 เท่านั้น แต่มีpolyfill สำหรับ 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
ใช้ rand () เพื่อรับหมายเลขสุ่มเพื่อสะท้อนคีย์สุ่ม ในตัวอย่าง: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
หนึ่งบรรทัด: $ran[rand(0, count($ran) - 1)]
ฉันต้องการเวอร์ชันหนึ่งบรรทัดสำหรับอาร์เรย์สั้น:
($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]
หรือถ้าอาร์เรย์ได้รับการแก้ไข:
[1, 2, 3, 4][mt_rand(0, 3]
On-ซับ:
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;
}
}
สำหรับบริบทเพิ่มเติมโปรดดูคำถามของฉันที่การส่งต่อ / การส่งคืนการอ้างอิงไปยังวัตถุ + วัตถุที่เปลี่ยนแปลงไม่ทำงาน
วิธีง่ายๆในการรับอาร์เรย์ Randdom รูปแบบคุ้มค่า
$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)
ตอนนี้ทุกครั้งที่คุณจะได้รับสีที่แตกต่างจากอาร์เรย์
คุณจะได้รับตัวเลขสุ่มจากอาร์เรย์ดังนี้:
$randomValue = $rand[array_rand($rand,1)];
array_rand
นี้ไม่สุ่มเท่าที่ควร