php explode: разбить строку на слова, используя пробел разделитель
$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 пробела после третьего слова.
есть ли способ сделать это быстро?
спасибо.
6 ответов
разбить строку в массив, вы должны использовать функции 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
вот один из способов, разбив строку и запустив регулярное выражение один раз, а затем проанализировав результаты, чтобы увидеть, какие сегменты были захвачены как split (и, следовательно, только пробелы), или какие из них являются словами:
$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) Матрица ( [0] => это [1] = > is [2] = > a [3] => строкой ) Матрица ( [0] => 1 [1] => 1 [2] => 4 ) int (1378392871) Матрица ( [0] => это [1] = > is [2] = > a [3] => строкой ) Матрица ( [0] => 1 [1] => 1 [2] => 4 ) int (1378392873)