Случайно выберите элемент в массиве, затем удалите из массива

У меня есть ряд фраз. Я хотел бы случайным образом выбирать фразы из массива в цикле. Я не хочу выбирать одну и ту же фразу более одного раза в цикле. Я думал, что могу случайно выбрать фразу, а затем удалить ее до следующего цикла.

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";

        }

    ?>

Можно ли случайным образом выбрать другую фразу из массива в каждом цикле.

Ответ 1

Перемешивайте массив в произвольном порядке и просто вытащите последний элемент.

$array = [...];

shuffle($array);

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

Ответ 2

Вы также можете использовать array_slice

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

Ответ 3

Поместите выбранные значения в новый массив и проверьте, существует ли он в новом массиве, если он не добавлен.

<?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);

Ответ 4

Вы также можете использовать 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 );

Ответ 5

Другие ответы здесь работают, но я хочу обратиться к вашему коду.

<?php

Я вывел определение $phrases вне цикла. Установив его внутри цикла, он был reset каждый раз и ничего хорошего.

$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];

Когда вы отключите массив, значение, которое входит в квадратные скобки, должно быть индексом элемента массива, который вы хотите удалить, а не элементом значения. Переменная внутри скобок была изменена с $ran_Phrase на ran_Num

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