随机选择数组中的元素,然后从数组中删除

时间:2013-06-14 14:23:37

标签: php arrays

我有一系列短语。我想在一个循环中从数组中随机选择短语。 我不想在循环中选择相同的短语一次。 我以为我可以随机选择短语,然后在下一个循环之前将其删除。

http://codepad.org/11l0nStX

<?php
for ($i=0; $i<16; $i++) {
    $phrases = array(
        'Hello Sailor', 'Acid Test', 'Bear Garden', 'Botch A Job',
        'Dark Horse', 'In The Red', 'Man Up', 'Pan Out',
        'Quid Pro Quo', 'Rub It In', 'Turncoat', 'Yes Man',
        'All Wet', 'Bag Lady', 'Bean Feast', 'Big Wig',
    );

    $ran_Num = array_rand($phrases);
    $ran_Phrase = $phrases[$ran_Num];
    unset($phrases[$ran_Phrase]);
    echo $ran_Phrase . "\r\n";
    echo count($phrases) . "\r\n";
}

是否可以在每个循环中从数组中随机选择一个不同的短语?

5 个答案:

答案 0 :(得分:31)

以随机顺序对数组进行随机播放,然后关闭最后一个元素。

$array = [...];

shuffle($array);

while($element = array_pop($array)){
  echo 'Random element:' . $element;
}

答案 1 :(得分:3)

您也可以使用array_slice

$ran_Num = array_rand($phrases);
$ran_Phrase = array_slice($phrases, $ran_Num, 1);

答案 2 :(得分:0)

将所选值放置一个新数组,然后检查它是否存在于新数组中,如果不添加它。

<?php
$phrases = array('Hello Sailor','Acid Test','Bear Garden','Botch A Job','Dark Horse',
    'In The Red','Man Up','Pan Out','Quid Pro Quo','Rub It In','Turncoat',
    'Yes Man','All Wet','Bag Lady','Bean Feast','Big Wig');

$default = 16;
if($default > ($c = count($phrases))) $default = $c;

$keys = array_rand($phrases, $default);

$newPhrases = array();
foreach($keys as $key){
    if(!isset($newPhrases[$key])){
        $newPhrases[$key] = $phrases[$key];
    }
}
print_r($newPhrases);

答案 3 :(得分:0)

您也可以使用array_rand和array_splice

$array = array('Hello Sailor','Acid Test','Bear Garden','Botch A Job','Dark Horse',
                'In The Red','Man Up','Pan Out','Quid Pro Quo','Rub It In','Turncoat',
                'Yes Man','All Wet','Bag Lady','Bean Feast','Big Wig');

$el = array_rand($array);
$dat = $array[$el];
array_splice($array, $el, 1 );

答案 4 :(得分:0)

此处的其他答案有效,但我想解决您的代码问题。

<?php

我在循环之外删除了$phrases的定义。通过在循环中设置它,它每次都被重置,这是不好的。

$phrases = array('Hello Sailor','Acid Test','Bear Garden','Botch A Job','Dark Horse',
        'In The Red','Man Up','Pan Out','Quid Pro Quo','Rub It In','Turncoat',
         'Yes Man','All Wet','Bag Lady','Bean Feast','Big Wig');

我不喜欢数数,所以我让电脑去做。

for($i=0,$n=count($phrases); $i<$n; $i++){

    $ran_Num = array_rand($phrases);
    $ran_Phrase = $phrases[$ran_Num];

在数组上取消设置时,方括号内的值应该是要删除的数组元素的索引,而不是value元素本身。括号内的变量已从$ran_Phrase更改为ran_Num

    unset($phrases[$ran_Num]);
    echo $ran_Phrase."\r\n";
    echo count($phrases)."\r\n";
}
?>