supprimer occurence tableau

djodjo
Invité n'ayant pas de compte PHPfrance

04 janv. 2012, 19:16

Bonjour,

Je veux supprimer certaine valeurs dans des chaines de caractères selon des conditions très précises.
Chaque caractère génère une autre valeur entre | |
Je précise que je ne peux pas changer ces chaines de caractère, faut que je fasse avec leurs formats :'(

p,B1 |5| |4| A5 , A7, A10 |6| |9| |11|

p,B5,B7 |1| |2,3,4| |5| A5 , A11 |4| |5|

p, B7, B8, B9 , B10 , B11 || || || || || || A9 , A25 |8| |17|

Je veux supprimer le début de chaque ligne selon l'algo suivant:
-compter le nombre d occurence séparé par une virgule AVANT le premier | et supprimer autant de couple de || quoiquil y est a l'intérieur
-sauvergarder le reste de la ligne

Dans mes exemples , ce qui est en rouge est ce que je veux supprimer. Et le reste est ce que je veux sauvegarder.

Comment dois je coder ce tronquage ? L'algo me parait un peu complexe, je viens de perdre mon aprem à essayer :p

Je vous remercie de toute aide apportée..

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

04 janv. 2012, 23:35

Tu dois pouvoir le faire à coup d'expression régulières uniquement, mais j'ai un peu la flemme de trouver la bonne, alors je te le donne avec substr_count et strpos pour calculer le nombre d'occurrences à éliminer :)
// compte le nombre de ',' jusqu'au premier '|', et ajoute 1 pour connaitre le nombre d'occurences
$nb = substr_count($taChaine, ',' , 0 , strpos($taChaine, '|')) + 1;

// remplace les 2*nb premières occurrences de "un truc suivi d'un pipe"  
echo preg_replace("/^(.*\|){".(2*$nb)."}/U", "", $taChaine);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

djodjo
Invité n'ayant pas de compte PHPfrance

05 janv. 2012, 13:53

Voici ce que l'on m'as proposé sur un autre forum, si cela peut servir à quelqu'un..
Je précise que ma chaîne de caractère un peu complexe était issu d'une fonction de drag and drop qui me renvoyait la position des éléments déplacé en gardant un hiérarchie père fils.
http://devheart.org/articles/jquery-cus ... -and-drop/
J'en doute mais bon.


Code : Tout sélectionner

<?php $str = "p, B7, B8, B9 , B10 , B11 || || || || || || A9 , A25 |8| |17|"; //$str = "p,B5,B7 |1| |2,3,4| |5| A5 , A11 |4| |5|"; $len = strlen($str); $nbComma = 0; $nbPipe = 0; $nbValues = 0; for($i = 0; $i < $len; ++$i) { $char = $str[$i]; if ($char === '|') { if ($nbPipe === 0) { $nbValues = ($nbComma + 1) * 2; } if (++$nbPipe === $nbValues) { $toKeep = trim(substr($str, $i + 1)); break; } } else if ($char === ',') { ++$nbComma; } } echo $toKeep; ?>

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

05 janv. 2012, 21:05

Ouais mais ma solution elle a quand même plus la classe :langue:
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...