Как я могу взорвать каждую третью точку с запятой (;) как часть?
Примеры данных: $ 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" }