Допустим, у меня есть строка:
$string = "This is my test case for an example."
Если я взорвусь на основе «Я получаю
Array('This','is','my','test','case','for','an','example.');
Я хочу, чтобы взорвался для любого другого пространства:
Array('This is','my test','case for','an example.').
Строка может содержать нечетное число слов, поэтому последний элемент в массиве может не содержать двух слов.
Кто-нибудь знает, как это сделать?
Я просмотрел результаты и объединил строки после факта.
$matches = array(); preg_match_all('/([A-Za-z0-9\.]+(?: [A-Za-z0-9\.]+)?)/', 'This is my test case for an example.',$matches); print_r($matches);
выходы:
Array ( [0] => Array ( [0] => This is [1] => my test [2] => case for [3] => an example. ) [1] => Array ( [0] => This is [1] => my test [2] => case for [3] => an example. ) )
обновление фиксировало его в соответствии с одним словом в конце предложения
Функция, которая может использоваться для разных разделителей и чисел.
function explodeEveryNth($delimiter, $string, $n) { $arr = explode($delimiter, $string); $arr2 = array_chunk($arr, $n); $out = array(); for ($i = 0, $t = count($arr2); $i < $t; $i++) { $out[] = implode($delimiter, $arr2[$i]); } return $out; }
Тестовый код
var_dump(explodeEveryNth(' ', 'This is a test string', 2));
$string = "This is my test case for an example."; preg_match_all("/[a-zA-Z0-9]+\ [a-zA-Z0-9]+/", $string, $matches); print_r($matches);
$matches = array(); preg_match_all('/\S+(?:\s[A-Za-z0-9.]+|$)/', 'This is my test case for an example.', $matches ); print_r($matches); preg_match_all('/\S+(?:\s[A-Za-z0-9.]+|$)/', 'This is my test case for example.', $matches ); print_r($matches);
Что-то, что вы можете использовать для других сценариев: (всегда лучше ИМО).
Хотя, возможно, это не самое элегантное решение, это соответствует основному синтаксису понятий других основных функций PHP …
В любом случае … Это использует рекурсию. Он гибкий, поскольку позволяет вам указать размер куска (если вы хотите сделать это по дороге или для другого проекта). Я сделал это как личный вызов, чтобы увидеть, что я могу придумать.
<?php function chunk_explode($glue=' ',$pieces='',$size=2,$final=array()) { if(!is_string($pieces) && !is_array($pieces)) return false; if(is_string($pieces)) $pieces = explode($glue,$pieces); $num_pieces = sizeof($pieces); if($num_pieces <= 0) return $final; if($num_pieces >= $size) { $arr_chunk = array_chunk($pieces, $size); array_push($final,implode($glue,$chunk[0])); for($i=0;$i<=$size;$i++) { array_shift($pieces); } return chunk_explode($glue,$pieces,$size,$final); } array_push($final,implode($glue,$pieces)); return $final; } $string = "This is my test case for an example."; chunk_explode(' ',$string,3);
Если функция chunk_explode
, сообщите мне, чтобы я мог учиться на своих ошибках.
В PHP есть 75 функций массива, давайте попробуем использовать их вместо циклов!
Мне нравится имя функции Кайла. (Предполагаю, что вы не используете 5.3 и страдаете с помощью create_function.)
function chunk_explode($string, $chunks = 2, $delim = ' ') { $A = explode($delim, $string); $A = array_chunk($A, $chunks); return array_map( create_function('$x', 'return implode(\'' . $delim . '\',$x);'), $A); }
$str = "This is my test case for an example."; $arr = split(' ', $str); $newArr = array(); $count = count($arr); for($i=0;$i<$count;$i = $i + 2) { $newArr[] = $arr[$i] . ' ' . $arr[$i+1]; } array(4) { [0]=> string(7) "This is" [1]=> string(7) "my test" [2]=> string(8) "case for" [3]=> string(11) "an example." }
Ну, очевидно, это не лучшее решение, но было интересно понять это по-своему. Еще так много узнать …
function solveThisPuzzle($string) { $modified_string = preg_replace('(\s)', '+', $string, -1, $count); $words = explode('+', $modified_string); $phrases_arr = array(); for($i = 1; $i < $count+1; $i++) { if(($i % 2)) { $phrase = $words[$i-1].' '.$words[$i]; $phrases_arr[] = $phrase; unset($phrases_arr[$i]); } elseif($i == $count) { $phrase = $words[$i]; $phrases_arr[] = $phrase; } else { $phrase = NULL; } } foreach($phrases_arr as $final_phrase) { $solution .= $final_phrase.'<br />'; } return $solution;
сfunction solveThisPuzzle($string) { $modified_string = preg_replace('(\s)', '+', $string, -1, $count); $words = explode('+', $modified_string); $phrases_arr = array(); for($i = 1; $i < $count+1; $i++) { if(($i % 2)) { $phrase = $words[$i-1].' '.$words[$i]; $phrases_arr[] = $phrase; unset($phrases_arr[$i]); } elseif($i == $count) { $phrase = $words[$i]; $phrases_arr[] = $phrase; } else { $phrase = NULL; } } foreach($phrases_arr as $final_phrase) { $solution .= $final_phrase.'<br />'; } return $solution;
}
$string = "This is my test case for an example, huzzah!"; echo solveThisPuzzle($string); This is my test case for an example, huzzah!