$str = "This is a string"; $words = explode(" ", $str);
Работает нормально, но пробелы по-прежнему идут в массив:
$words === array ('This', 'is', 'a', '', '', '', 'string');//true
Я предпочел бы иметь слова только без пробелов и хранить информацию о количестве пробелов отдельно.
$words === array ('This', 'is', 'a', 'string');//true $spaces === array(1,1,4);//true
Просто добавлено: (1, 1, 4)
означает одно место после первого слова, одно место после второго слова и 4 пробела после третьего слова.
Есть ли способ сделать это быстро?
Спасибо.
Чтобы разделить String на массив, вы должны использовать preg_split :
$string = 'This is a string'; $data = preg_split('/\s+/', $string);
Ваша вторая часть (подсчет пробелов):
$string = 'This is a string'; preg_match_all('/\s+/', $string, $matches); $result = array_map('strlen', $matches[0]);// [1, 1, 4]
$financialYear = 2015-2016;
$test = explode('-',$financialYear); echo $test[0]; // 2015 echo $test[1]; // 2016
Вот один из способов: разбить строку и запустить регулярное выражение один раз, затем проанализировать результаты, чтобы увидеть, какие сегменты были захвачены как разделение (и, следовательно, только пробелы), или какие-то слова:
$temp = preg_split('/(\s+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $spaces = array(); $words = array_reduce( $temp, function( &$result, $item) use ( &$spaces) { if( strlen( trim( $item)) === 0) { $spaces[] = strlen( $item); } else { $result[] = $item; } return $result; }, array());
Из этой демонстрации видно, что $words
:
Array ( [0] => This [1] => is [2] => a [3] => string )
И $spaces
:
Array ( [0] => 1 [1] => 1 [2] => 4 )
Другой способ сделать это – использовать цикл foreach.
$str = "This is a string"; $words = explode(" ", $str); $spaces=array(); $others=array(); foreach($words as $word) { if($word==' ') { array_push($spaces,$word); } else { array_push($others,$word); } }
Вы можете использовать preg_split()
для первого массива:
$str = 'This is a string'; $words = preg_split('#\s+#', $str);
И preg_match_all()
для массива $spaces
:
preg_match_all('#\s+#', $str, $m); $spaces = array_map('strlen', $m[0]);
Вот результаты тестов производительности:
$str = "This is a string"; var_dump(time()); for ($i=1;$i<100000;$i++){ //Alma Do Mundo - the winner $rgData = preg_split('/\s+/', $str); preg_match_all('/\s+/', $str, $rgMatches); $rgResult = array_map('strlen', $rgMatches[0]);// [1,1,4] } print_r($rgData); print_r( $rgResult); var_dump(time()); for ($i=1;$i<100000;$i++){ //nickb $temp = preg_split('/(\s+)/', $str, -1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $spaces = array(); $words = array_reduce( $temp, function( &$result, $item) use ( &$spaces) { if( strlen( trim( $item)) === 0) { $spaces[] = strlen( $item); } else { $result[] = $item; } return $result; }, array()); } print_r( $words); print_r( $spaces); var_dump(time());
int (1378392870) Array ([0] => Это [1] => is [2] => a [3] => string) Array ([0] => 1 [1] => 1 [2] => 4) int (1378392871) Array ([0] => This [1] => is [2] => a [3] => string) Array ([0] => 1 [1] => 1 [2] => 4) int (1378392873)