2010-11-21 6 views
1

Travailler sur un type de base de liste de type "formulaire au fichier texte". Tout fonctionne bien, sauf qu'il insère un <li></li> vide au bas de la liste. J'utilise un délimiteur de retour chariot et j'ai essayé d'utiliser str_replace pour supprimer le retour chariot de la boucle. Mais ça ne marche pas vraiment. Y a-t-il quelque chose qui me manque? Ou des suggestions sur la façon de supprimer ce bugger.Élément de liste supplémentaire dans une boucle foreach PHP

Voici le fichier de traitement de forme

$name = $_POST[ 'name' ]; 
$guests = $_POST[ 'guests' ]; 
$data = "$name $guests\r"; 
$open = fopen("list.txt", "a"); 
fwrite($open, $data); 
fclose($open); 

fichier de sortie PHP

$file = "list.txt"; 
    $open = fopen($file, 'r'); 
    $data = fread($open, filesize($file)); 
    fclose($open); 

    $list = explode("\r", $data); 
    $string = str_replace("\r", "", $list); 

    foreach($string as $value) { 
     echo '<li>'.ucwords($value).'</li>'."\n"; 
    } 

Et voici comment le balisage ressemble à la sortie de PHP

<li>Person One 1</li> 
<li>Person Two 4</li> 
<li>Person Three 2</li> 
<li></li> 

Toute aide serait grandement appréciée .

Répondre

2

utilisation Couper pour couper la traîne entre de votre chaîne avant l'exploser

$list = explode("\r", trim($data)); 
4

est ici un moyen de coder défensivement pour les valeurs vides ...

foreach($string as $value) 
{ 
    //to be really foolproof, let's trim! 
    $value=trim($value); 

    //only output if we have something... 
    if (!empty($value)) 
    { 
     echo '<li>'.ucwords($value).'</li>'."\n"; 
    } 
} 
+0

Excellente solution ... merci beaucoup –

1

Retirez le str_replace appel, et juste sauter les éléments qui ne contiennent rien, ou seulement des caractères blancs:

foreach($string as $value) { 
    if (!preg_match("/^\\s*$/", $value)) { 
     echo '<li>'.ucwords($value).'</li>'."\n"; 
    } 
} 
Questions connexes