php взрывает каждый третий экземпляр персонажа

Как я могу взорвать каждую третью точку с запятой (;) как часть?

Примеры данных: $ string = шт. 1, шт. 2; шт. 3; кусок4; кусок5; кусок6; кусок7; кусок8;

Пример вывода:

$output[0] = piece1;piece2:piece3; $output[1] = piece4;piece5;piece6; $output[2] = piece7;piece8; 

Благодаря!

Я уверен, что вы можете сделать что-то пятно с регулярными выражениями, но почему бы не просто взорвать каждый полуколок, а затем добавить их по три за раз.

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

Самое простое решение, о котором я могу думать, это:

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

По сути то же самое решение, что и другие, которые explode и присоединяются снова …

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

Возможно, подходите к нему под другим углом. Explode () все, а затем объединить его обратно в три раза. Вот так…

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

Массив ([0] => 1; 2; 3; [1] => 4; 5; 6; [2] => 7; 8; 9;)

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

Вот подход с регулярным выражением, который я не могу сказать, слишком хорошо выглядит.

 $str=''; for ($i=1; $i<20; $i++) { $str .= "$i;"; } $split = preg_split('/((?:[^;]*;){3})/', $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 

Вывод:

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

Другой подход с регулярным выражением.

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

Результаты:

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

Regex 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" }