2009-08-13 11 views
5

Comment puis-je faire exploser chaque troisième point-virgule (;) en tant que pièce?php explose chaque troisième instance de caractère

données d'exemple: $ chaîne = pièce1; pièce2; pièce3; pièce4; pièce5; pièce6; pièce7; pièce8;

exemple de sortie serait:

$output[0] = piece1;piece2:piece3; 

$output[1] = piece4;piece5;piece6; 

$output[2] = piece7;piece8; 

Merci!

+0

+1 amour la question, et la variété des réponses :) – karim79

Répondre

7

Je suis sûr que vous pouvez faire quelque chose de lisse avec des expressions régulières, mais pourquoi ne pas simplement exploser chaque semicolor et ensuite les ajouter trois à la fois.

$tmp = explode(";", $string); 
$i=0; 
$j=0; 

foreach($tmp as $piece) { 
    if(! ($i++ %3)) $j++; //increment every 3 
    $result[$j] .= $piece; 
} 
+0

je pensais exactement la même chose ... bien qu'il doit y avoir un moyen plus joli avec des expressions régulières. –

+0

très bien pourrait être. Mais, comme je suis terrible avec les expressions régulières, je les évite et fais des trucs compliqués comme ci-dessus –

+0

"même s'il doit y avoir une manière plus jolie avec les expressions régulières." hahahahahahahaha – nickf

2

Peut-être l'approcher d'un angle différent. Explode() tout, puis combine en triples. Comme tant ...

$str = "1;2;3;4;5;6;7;8;9"; 
$boobies = explode(";", $array); 
while (!empty($boobies)) 
{ 
    $foo = array(); 
    $foo[] = array_shift($boobies); 
    $foo[] = array_shift($boobies); 
    $foo[] = array_shift($boobies); 
    $bar[] = implode(";", $foo) . ";"; 
} 

print_r($bar); 

Tableau ( [0] => 1; 2; 3; [1] => 4; 5; 6; [2] => 7; 8; 9 ; )

+0

Charme variable nommage. – linead

+0

Downvote supprimé, mais je dois dire que je trouve tout (! Vide ($ boobies)) plutôt dérangeant. Et j'espère que vous ne pornisez pas vos noms de variables au travail. – karim79

1
$string = "piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8;piece9;"; 
preg_match_all('/([A-Za-z0-9\.]*;[A-Za-z0-9\.]*;[A-Za-z0-9\.]*;)/',$string,$matches); 

print_r($matches); 

Array 
(
    [0] => Array 
     (
      [0] => piece1;piece2;piece3; 
      [1] => piece4;piece5;piece6; 
      [2] => piece7;piece8;piece9; 
     ) 

    [1] => Array 
     (
      [0] => piece1;piece2;piece3; 
      [1] => piece4;piece5;piece6; 
      [2] => piece7;piece8;piece9; 
     ) 

) 
+2

Cela échoue lorsque le nombre de pièces n'est pas un multiple de 3. – mercator

1

est ici une approche regex, que je ne peux pas dire est trop beau.

$str=''; 
for ($i=1; $i<20; $i++) { 
    $str .= "$i;"; 
} 

$split = preg_split('/((?:[^;]*;){3})/', $str, -1, 
        PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

Sortie:

Array 
(
    [0] => 1;2;3; 
    [1] => 4;5;6; 
    [2] => 7;8;9; 
    [3] => 10;11;12; 
    [4] => 13;14;15; 
    [5] => 16;17;18; 
    [6] => 19; 
) 
1

Une autre approche regex.

<?php 
$string = 'piece1;piece2;piece3;piece4;piece5;piece6;piece7;piece8'; 
preg_match_all('/([^;]+;?){1,3}/', $string, $m, PREG_SET_ORDER); 
print_r($m); 

Résultats:

Array 
(
    [0] => Array 
     (
      [0] => piece1;piece2;piece3; 
      [1] => piece3; 
     ) 

    [1] => Array 
     (
      [0] => piece4;piece5;piece6; 
      [1] => piece6; 
     ) 

    [2] => Array 
     (
      [0] => piece7;piece8 
      [1] => piece8 
     ) 

) 
+0

pour formater le tableau de sortie comme décrit: $ m = array_map (create_function ('$ a', 'return $ a [0];'), $ m) – danamlund

0

Regex de Split

$test = ";2;3;4;5;6;7;8;9;10;;12;;14;15;16;17;18;19;20"; 
// match all groups that: 
// (?<=^|;) follow the beginning of the string or a ; 
// [^;]* have zero or more non ; characters 
// ;? maybe a semi-colon (so we catch a single group) 
// [^;]*;? again (catch second item) 
// [^;]* without the trailing ; (to not capture the final ;) 
preg_match_all("/(?<=^|;)[^;]*;?[^;]*;?[^;]*/", $test, $matches); 
var_dump($matches[0]); 


array(7) { 
    [0]=> 
    string(4) ";2;3" 
    [1]=> 
    string(5) "4;5;6" 
    [2]=> 
    string(5) "7;8;9" 
    [3]=> 
    string(6) "10;;12" 
    [4]=> 
    string(6) ";14;15" 
    [5]=> 
    string(8) "16;17;18" 
    [6]=> 
    string(5) "19;20" 
} 
3

essentiellement la même solution que les autres que explode et rejoindre à nouveau ...

$tmp = explode(";", $string); 

while ($tmp) { 
    $output[] = implode(';', array_splice($tmp, 0, 3)); 
}; 
5

solution la plus simple Je peux penser o f est:

$chunks = array_chunk(explode(';', $input), 3); 
$output = array_map(create_function('$a', 'return implode(";",$a);'), $chunks); 
+0

+1 pour la première ligne, -1 pour la seconde;) (l'utilisation de 'create_function()' est mauvaise). À partir de PHP 5.3 vous pouvez utiliser une fonction lambda pour cela, cependant: '$ output = array_map (fonction ($ a) {return implode (';', $ a);}, $ morceaux);' – mercator

+0

Ouais vrai. Je suppose que nous pouvons commencer à utiliser les fonctionnalités 5.3 dans les réponses maintenant qu'il est publié. – cletus

+0

+1 pour le code qui fonctionne dès la sortie de la boîte (même si c'est un peu obsolète). Je voulais une solution rapide que je pourrais glisser et déposer, et personnaliser facilement. C'était ça. –

Questions connexes