Page 1 sur 1

Boucle while

Posté : 15 juin 2007, 10:08
par JMB
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.

Posté : 15 juin 2007, 10:22
par Ryle
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);

Posté : 15 juin 2007, 10:29
par Invité
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.

Posté : 15 juin 2007, 18:11
par jed
$var = preg_replace ("|", "\n", $A);
:wink: