Подтвердить что ты не робот

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 пробела после третьего слова.

Есть ли способ сделать это быстро?

Спасибо.

4b9b3361

Ответ 1

Чтобы разделить 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]

Ответ 2

$financialYear = 2015-2016;

$test = explode('-',$financialYear);
echo $test[0]; // 2015
echo $test[1]; // 2016

Ответ 3

Вот один из способов: разбить строку и запустить регулярное выражение один раз, затем проанализировать результаты, чтобы увидеть, какие сегменты были захвачены как разделение (и, следовательно, только пробелы), или какие-то слова:

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

Ответ 4

Вы можете использовать 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]);

Ответ 5

Другой способ сделать это - использовать цикл 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);
}
}

Ответ 6

Вот результаты тестов производительности:

$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] = > есть   [2] = > a   [3] = > строка ) массив (   [0] = > 1   [1] = > 1   [2] = > 4 ) INT (1378392871) массив (   [0] = > Это   [1] = > есть   [2] = > a   [3] = > строка ) массив (   [0] = > 1   [1] = > 1   [2] = > 4 ) INT (1378392873)