2016-06-29 14 views
1

dieser Code unten sollten geben 5 zufällige Elemente aus einer Textdatei holen und sie nacheinander angezeigt werden:PHP while-Schleife ist mir eine zufällige Anzahl von Ergebnissen

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; 

Dies ist der Inhalt der Mitglieder. txt:

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

Das Problem ist, dass es wird nicht immer 5 angezeigt werden, von Zeit zu Zeit zeigt nur 4 und einige andere Zeiten 6. Warum ist das so? Wie kann ich es reparieren, so dass es nur 5 IMMER anzeigt?

Vielen Dank.

+0

können Sie sagen, was members.txt enthält –

+0

Sorry, ich habe einen Fehler gemacht. Ich habe gerade meine Frage bearbeitet. –

Antwort

1

Da Sie * am Ende der Zeile haben, wird eines der Elemente von $members eine leere Zeichenfolge sein. Wenn Sie zu diesem Element gelangen, gibt explode('|', $members[$i++]) das Array [''] zurück, so dass if(!empty($details[0])) es überspringt. Aber da Sie $i inkrementiert haben, werden nur 4 Mitglieder angezeigt.

Ich kann jedoch keine Möglichkeit sehen, dass Ihr Code 6 Mitglieder anzeigen konnte.

Der Fix ist nur * zwischen Elementen zu verwenden, nicht nach ihnen. Oder entfernen Sie die leere Zeichenfolge von $members.

$members = array_filter($members); 
+0

Ich fand Ihre Logik sind zu stark. + 10.Danke für die Erklärung. –

+0

Dieser Filter sollte vor oder nach dem Mischen gehen? –

+0

Es spielt keine Rolle. – Barmar