2013-06-14 6 views
11

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

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

     } 

    ?> 

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

+0

использовать что-то вроде array_pop который выскакивает и возвращает последнее значение массива, сокращая массив по одному элемент. – Anderscc

ответ

25

Смешайте массив в случайном порядке и просто вытащите последний элемент.

$array = [...]; 

shuffle($array); 

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

Ты избил меня до этого –

+0

Мне нравится этот подход, простой и чистый. Единственная проблема заключается в том, что вы получаете перетасованный массив, поэтому это не распространяется на все случаи использования –

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); 
+0

'in_array' и' array_rand' в цикле будет плохой идеей. –

+0

Мне нравится, что ты лучше. Но это вариант. –

+0

Вы можете закрепить - используйте 'array_flip' один раз в начале, а затем выполните поиск следующим образом:' if (isset ($ phrases [$ phrase])) '. Это было бы намного быстрее, особенно в цикле :) –

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

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

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

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

$ran_Num = array_rand($phrases); 
$ran_Phrase = array_slice($phrases, $ran_Num, 1); 
Смежные вопросы