2013-09-05 22 views
13
$str = "This is a string"; 
$words = explode(" ", $str); 

działa dobrze, ale obowiązuje nadal iść do tablicy:php eksplodować: split ciąg słowami używając przestrzeń separatora

$words === array ('This', 'is', 'a', '', '', '', 'string');//true 

wolałbym mieć słowa tylko bez spacji i przechowywać informacje o liczba spacji oddzielna.

$words === array ('This', 'is', 'a', 'string');//true 
$spaces === array(1,1,4);//true 

tylko dodania: (1, 1, 4) oznacza jedno miejsce po pierwsze słowo, jedno miejsce po drugie słowo i 4 spacji po trzecie słowo.

Czy można to szybko zrobić?

Dziękuję.

+1

http://stackoverflow.com/questions/3432183/how-can-i-remove-all-empty -values-when-i-explode-a-string-using-php – Habib

+0

Czy chcesz liczbę spacji lub pozycję każdej przestrzeni? –

+0

@JasonMcCreary On chce liczbę kolejnych spacji w każdej grupie przestrzennej: ''' (1), '' (1), '' (4)'. – silkfire

Odpowiedz

22

do podziału String do tablicy, należy użyć preg_split:

$string = 'This is a string'; 
$data = preg_split('/\s+/', $string); 

Twoja druga część (licząc ze spacjami):

$string = 'This is a string'; 
preg_match_all('/\s+/', $string, $matches); 
$result = array_map('strlen', $matches[0]);// [1, 1, 4] 
+0

Gdzie spodziewana jest "liczba spacji" w pytaniu? – Bora

+0

Dziękuję za odpowiedź. W przeciwnym razie tracisz informacje o liczbie spacji pomiędzy nimi. To właśnie zadałem w pytaniu (zobacz pogrubiony tekst). – Haradzieniec

+0

@Haradzieniec po prostu to wpisuję, tak. Dzięki, zaktualizowałem. –

1

Można użyć preg_split() dla pierwszej tablicy:

$str = 'This is a string'; 
$words = preg_split('#\s+#', $str); 

I preg_match_all() dlaMacierz:

preg_match_all('#\s+#', $str, $m); 
$spaces = array_map('strlen', $m[0]); 
+0

1, 1, 4 oznacza jedną spację po pierwszym słowie, jedną spację za drugim słowem i 4 spacje po trzecim słowie. – Haradzieniec

+0

@Haradzieniec Zobacz moją edycję :) – silkfire

1

Innym sposobem na to byłoby użycie pętli 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); 
} 
} 
+0

Dziękuję. Jednak zbiera spacje, ale nie zawiera informacji o liczbie spacji między słowami. – Haradzieniec

2

Oto jeden sposób, dzieląc ciąg i działa regex raz, a następnie analizowanie wyników, aby zobaczyć, które segmenty zostały ujęte jako ułamek (a więc tylko spacje) lub te, które są słowa:

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

Widać from this demo że $words jest:

Array 
(
    [0] => This 
    [1] => is 
    [2] => a 
    [3] => string 
) 

I $spaces jest:

Array 
(
    [0] => 1 
    [1] => 1 
    [2] => 4 
) 
+0

dziękuję bardzo za odpowiedź. Przetestowałem zarówno twoje, jak i Alma Do Mundo/rozwiązania Silkfire. Wszystkie rozwiązania działają dobrze, ale praca Almy Do Mundo jest około dwa razy szybsza. Dziękuję za rozwiązanie. Możesz porównać oba, jeśli chcesz (w mgnieniu oka zobacz moją odpowiedź na własne pytanie). – Haradzieniec

0

Tutaj są wyniki badań skuteczności:

$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] => to [1] => to [2] => a [3] => łańcuch ) Tablica ( [0] => 1 [1] => 1 [2] => 4 ) int (1378392871) 0.123.Tablica ( [0] => to [1] => to [2] => A [3] => łańcuch ) Tablica ( [0] => 1 [1] = > 1 [2] => 4 ) int (1378392873)

4

$financialYear = 2015-2016;

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