2016-06-29 2 views
1

этот код ниже предполагается выбрать 5 случайных пользователей из текстового файла и отображать их один за другим:PHP во время цикла дает мне случайное число результатов

function display() { 
$open_file = fopen("members.txt", 'r'); 
$members = explode("*", fgets($open_file)); 
$members_num = count($members); 
$i=1; 
shuffle($members); 
while($i <= 5) { 
    $details = explode("|", $members[$i++]); 
    if(!empty($details[0])) { 
    echo <<<EOF 
    $details[0] $details[1] $details[2] 
EOF; 
} 
} 
    fclose($open_file); 
} 

ob_start(); 
display(); 
$display = ob_get_contents(); 
ob_end_clean(); 

$content=<<<EOF 
some text here $display more text 
<br> 
etc. 
EOF; 

echo $content; 

Это содержание членов. ТХТ:

*James Johnson|USA|Male|1*Mary Reis|Germany|Female|2*Lin Xi|China|Male|3*Jessica Andrew|UK|Female|4* 

проблема заключается в том, что оно не всегда отображает 5, время от времени он показывает только 4 и некоторые другие времена 6. Почему это? Как я могу исправить это, так что он отображает только 5 ВСЕГДА?

спасибо.

+0

Вы можете указать, что должно указывать содержание. Txt содержит –

+0

Извините, я допустил ошибку. Я только что редактировал мой вопрос. –

ответ

1

Поскольку у вас есть * в конце строки, один из элементов $members будет пустой строкой. Когда вы доберетесь до этого элемента, explode('|', $members[$i++]) вернет массив [''], поэтому if(!empty($details[0])) пропустит его. Но так как вы увеличиваете $i, это приводит к отображению только 4 членов.

Я не вижу, чтобы ваш код мог отображать 6 членов.

Исправление состоит только из * между элементами, а не после них. Или удалите пустую строку с $members.

$members = array_filter($members); 
+0

Я нашел вашу логику слишком сильной. + 10. Спасибо за объяснение. –

+0

Этот фильтр должен проходить до или после перетасовки? –

+0

Это не имеет значения. – Barmar