배열에서 임의의 값을 얻는 방법은 무엇입니까?


123

나는 배열이 $ran = array(1,2,3,4);

이 배열에서 임의의 값을 가져 와서 변수에 저장해야합니다. 어떻게해야합니까?

답변:


232

다음을 수행 할 수도 있습니다.

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

이것은 연관 배열이있을 때 수행하는 방법입니다.


11
이에 따라 의견 것은 array_rand 그것이 있어야로 무작위 아니다
티모 Huovinen

1
또는 이 패키지 를 요구 하여 사용할 수 있습니다array_rand_value
murze

10
PHP 7.1 이후 array_rand(): 메르 센 트위스터 발생기 사용 mt_srand 별명에는, mt_rand 별명 랜드 ()을하고부터 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
Err, 제 생각에는 mt_rand (0, count ($ ran)-1)
Josh Davis

PHP 주석에 따르면 array_rand무작위가 아니므로 mt_rand선호합니다
Timo Huovinen 2014 년

1
전체 isset부분 의 요점은 무엇입니까 ? 어쨌든 연관 배열에 대해서는 실패합니다.
Luke Cousins ​​2015 년

난 이유를 알고 있지만, 사용하지 않을 때는 않는 mt_rand대신 rand이 경우하면 다른 사람보다 더 많은 일부 항목을 선호하는 것 같다
user151496

20
$value = $array[array_rand($array)];

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 함수는 그 이후로 눈에 띄게 성장했습니다 Arr::random(). Laravel 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_random($array, 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

@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
Ólafur Waage

첫 번째 $ rand는 가치에 관한 것입니다. 원래 배열의 값은 1 ~ 4입니다. 두 번째 $ rand는 배열 키, 0 ~ 3에 관한 것입니다.
Josh Davis

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

짧은 배열을 위해 한 줄 버전이 필요했습니다.

($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

Randdom 값을 Array 에서 얻는 간단한 방법 입니다.

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

이제 매번 Array 에서 다른 색상을 얻을 수 있습니다.


-5

다음과 같이 배열에서 임의의 숫자를 얻습니다.

$randomValue = $rand[array_rand($rand,1)];

4
array_rand ()는 임의의 값이 아닌 임의의 키를 반환합니다.
reko_t
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.