У меня есть множество фраз. Я хотел бы случайным образом выбирать фразы из массива в цикле. Я не хочу выбирать одну и ту же фразу более одного раза в цикле. Я думал, что могу случайно выбрать фразу, а затем удалить ее до следующего цикла.
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"; } ?>
Можно ли случайным образом выбрать другую фразу из массива в каждом цикле.
Перемешайте массив в случайном порядке и просто вытащите последний элемент.
$array = [...]; shuffle($array); while($element = array_pop($array)){ echo 'Random element:' . $element; }
Вы также можете использовать array_slice
$ran_Num = array_rand($phrases); $ran_Phrase = array_slice($phrases, $ran_Num, 1);
Вы также можете использовать 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 );
Другие ответы здесь работают, но я хочу обратиться к вашему коду.
<?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];
Когда вы отключаетесь от массива, значение, которое входит в квадратные скобки, должно быть индексом элемента массива, который вы хотите удалить, а не самим элементом значения. Переменная внутри скобок была изменена с $ran_Phrase
на ran_Num
unset($phrases[$ran_Num]); echo $ran_Phrase."\r\n"; echo count($phrases)."\r\n"; } ?>
неunset($phrases[$ran_Num]); echo $ran_Phrase."\r\n"; echo count($phrases)."\r\n"; } ?>
Поместите выбранные значения в новый массив и проверьте, существует ли он в новом массиве, если он не добавлен.
<?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);