2009-08-13 8 views
5

Jak mogę rozbić co trzeci średnik (;) jako kawałek?php eksploduje co trzecie wystąpienie postaci

przykładowe dane: $ string = piece1; piece2; piece3; piece4; piece5; piece6; piece7; piece8;

przykład wyjście byłoby:

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

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

$output[2] = piece7;piece8; 

Dzięki!

+0

+1 Miłość pytanie, a różnorodność odpowiedzi :) – karim79

Odpowiedz

7

Jestem pewien, że możesz zrobić coś gładkiego z wyrażeń regularnych, ale dlaczego nie po prostu rozbić każdy półkolor, a następnie dodać je po trzy na raz.

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

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

myślałem dokładnie to samo ... chociaż nie musi być ładniejszy sposób z wyrażeń regularnych. –

+0

tam może być bardzo dobrze. Ale ponieważ jestem okropny w wyrażeniach regularnych, unikam ich i robię podstępne rzeczy, takie jak powyżej: –

+0

"chociaż musi istnieć ładniejsza metoda z wyrażeń regularnych". hahahahahahahaha – nickf

2

Może podchodzić do niego pod innym kątem. Rozbij() to wszystko, a następnie połącz je z powrotem w trzykrotnie. Podobnie jak ...

$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); 

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

+0

Urocza zmienna nazwa. – linead

+0

Usunięto dno, ale muszę powiedzieć, że znajduję (niepotrzebnie (boobies)) niepokojące. I mam nadzieję, że nie wymieniacie nazw zmiennych w pracy. – 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

Nie powiedzie się, gdy liczba sztuk nie jest wielokrotnością 3. – mercator

1

Oto podejście regex, których nie mogę powiedzieć, to wszystko zbyt dobrze wygląda.

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

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

wyjściowa:

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

Innym podejściem regex.

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

Wyniki:

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

, aby sformatować tablicę wyników zgodnie z opisem: $ m = array_map (create_function ('$ a', 'return $ a [0];'), $ m); – danamlund

0

Regex dzielona

$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

Zasadniczo takie samo rozwiązanie jak w innych te, które explode i dołącz ponownie ...

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

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

najprostszym rozwiązaniem Mogę myśleć o f jest:

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

+1 dla pierwszego wiersza, -1 dla drugiego;) (używanie 'create_function()' jest złe w praktyce). Począwszy od PHP 5.3 możesz użyć do tego funkcji lambda: '$ output = array_map (function ($ a) {return implode (';', $ a);}, $ chunks);' – mercator

+0

Tak, to prawda. Sądzę, że możemy zacząć używać 5.3 funkcji w odpowiedziach, które teraz pojawiły się. – cletus

+0

+1 dla kodu, który działa od razu po wyjęciu z pudełka (nawet jeśli jest nieco przestarzały). Chciałem szybkiego rozwiązania, które mogłem przeciągnąć i upuścić, i łatwo dostosować. To było to. –