Boucle while

JMB
Petit nouveau ! | 6 Messages

15 juin 2007, 10:08

Bonjour à tous, newbie en PHP, j'éprouve un problème pour le traitement de cette chaine.

Code : Tout sélectionner

$A="a.php|xx;a.php|yy;b.php|ss;uu.php|rr;uu.php|dd;uu.php|gg;";
Je souhaiterai abtenir le résultat suivant :

Code : Tout sélectionner

a.php xx yy b.php ss uu.php rr dd gg
Je pense que la manière la plus élégante est un "while" mais je n'arrive pas à la mettre en application.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 juin 2007, 10:22

Le plus élégant serait peut être de passer par une expression régulière, avec un pattern du genre
"/(.*)[;|\|]/Ui"
Cela devrait te permettre de retrouver dans le tableau des résultats capturés par les parenthèses, toutes les chaines qui se terminent par un point virgule ou un pipe.. il te suffirait ensuite de purger les doublons à l'aide des fonctions sur les tableaux... c'est à tester par contre, chuis pas certain de la syntaxe :)

Sinon tu peux jouer avec explode() ou parcourir la chaine caractère par caractère et construire un tableau de sous-chaines à chaque fois que tu tombes sur un ; ou |
$str = ''; // sous-chaine, variable temporaire
$tab = array(); // tableau de résultat
for ($i=0; $i<strlen($chaine); $i++) {
  if ($chaine[$i] == ';' || $chaine[$i] == '|') { // si caractère séparateur trouvé
    $tab[] = $str; // ajout de la chaine dans le tableau
    $str = ''; // raz de la chaine
  }
  else { // sinon
    $str.= $chaine[$i]; // ajout du caractère dans la sous chaine
  }
}
print_r($tab);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2007, 10:29

Merci pour cette réponse rapide.

J'avais abordé le problème en bouclant sur des comparaisons de sous-chaines après 2 "explodes",
mais je pensais que boucler avec un while était plus "élégant".

Encore merci pour cette solution.

jed
Eléphant du PHP | 218 Messages

15 juin 2007, 18:11

$var = preg_replace ("|", "\n", $A);
:wink: