diff --git a/src/Illuminate/Collections/Arr.php b/src/Illuminate/Collections/Arr.php index 8ef2e770fbcf..6e860fd72c96 100644 --- a/src/Illuminate/Collections/Arr.php +++ b/src/Illuminate/Collections/Arr.php @@ -635,32 +635,31 @@ public static function random($array, $number = null, $preserveKeys = false) } if (is_null($number)) { - return head(array_slice($array, random_int(0, $count - 1), 1)); + return $array[array_rand($array)]; } if ((int) $number === 0) { return []; } - $keys = array_keys($array); - $count = count($keys); - $selected = []; + $keys = array_rand($array, $number); - for ($i = $count - 1; $i >= $count - $number; $i--) { - $j = random_int(0, $i); + $results = []; - if ($preserveKeys) { - $selected[$keys[$j]] = $array[$keys[$j]]; - } else { - $selected[] = $array[$keys[$j]]; + if ($preserveKeys) { + foreach ((array) $keys as $key) { + $results[$key] = $array[$key]; + } + } else { + foreach ((array) $keys as $key) { + $results[] = $array[$key]; } - - $keys[$j] = $keys[$i]; } - return $selected; + return $results; } + /** * Set an array item to a given value using "dot" notation. * @@ -710,29 +709,15 @@ public static function set(&$array, $key, $value) */ public static function shuffle($array, $seed = null) { - if (! is_null($seed)) { + if (is_null($seed)) { + shuffle($array); + } else { mt_srand($seed); shuffle($array); mt_srand(); - - return $array; - } - - if (empty($array)) { - return []; - } - - $keys = array_keys($array); - - for ($i = count($keys) - 1; $i > 0; $i--) { - $j = random_int(0, $i); - $shuffled[] = $array[$keys[$j]]; - $keys[$j] = $keys[$i]; } - $shuffled[] = $array[$keys[0]]; - - return $shuffled; + return $array; } /** diff --git a/tests/Support/SupportArrTest.php b/tests/Support/SupportArrTest.php index a5aedae72983..f27e9fdf1028 100644 --- a/tests/Support/SupportArrTest.php +++ b/tests/Support/SupportArrTest.php @@ -731,19 +731,6 @@ public function testRandom() $this->assertCount(2, array_intersect_assoc(['one' => 'foo', 'two' => 'bar', 'three' => 'baz'], $random)); } - public function testRandomIsActuallyRandom() - { - $values = []; - - for ($i = 0; $i < 100; $i++) { - $values[] = Arr::random(['foo', 'bar', 'baz']); - } - - $this->assertContains('foo', $values); - $this->assertContains('bar', $values); - $this->assertContains('baz', $values); - } - public function testRandomNotIncrementingKeys() { $random = Arr::random(['foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz']); @@ -830,34 +817,10 @@ public function testSet() public function testShuffleWithSeed() { - $this->assertSame( + $this->assertEquals( Arr::shuffle(range(0, 100, 10), 1234), Arr::shuffle(range(0, 100, 10), 1234) ); - - $this->assertNotSame( - range(0, 100, 10), - Arr::shuffle(range(0, 100, 10), 1234) - ); - } - - public function testShuffle() - { - $source = range('a', 'z'); // alphabetic keys to ensure values are returned - - $sameElements = true; - $dontMatch = false; - - // Attempt 5x times to prevent random failures - for ($i = 0; $i < 5; $i++) { - $shuffled = Arr::shuffle($source); - - $dontMatch = $dontMatch || $source !== $shuffled; - $sameElements = $sameElements && $source === array_values(Arr::sort($shuffled)); - } - - $this->assertTrue($sameElements, 'Shuffled array should always have the same elements.'); - $this->assertTrue($dontMatch, 'Shuffled array should not have the same order.'); } public function testEmptyShuffle()