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

スペースを使用して、単語に分割した文字列が正常に動作しますが、スペースはまだ配列に行く:PHPは爆発:区切り

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

私は唯一のスペースなしで単語を持っているとの情報を維持することを好むだろうスペースの数は別です。

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

追加した:(1, 1, 4)は、第3ワードの後の最初の単語の後にスペース、第2のワードの後に​​スペースと4つのスペースを意味します。

速い方法はありますか?

ありがとうございます。配列に文字列を分割する

+1

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

+0

スペースの数または各スペースの位置が必要ですか? –

+0

@JasonMcCreary彼は各空間グループの連続するスペースの数を望んでいます: '''、 ''(1)、 ''(4)'。 – silkfire

答えて

22

、あなたが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] 
+0

質問者の「スペースの数」はどこにありますか? – Bora

+0

あなたの答えをありがとう。ハウエル、間にあるスペースの数についての情報を失う。それは私が質問で尋ねたものです(太字のテキストを参照してください)。 – Haradzieniec

+0

@ Haradzieniecちょうどそれを入力して、はい。ありがとう、私は更新しました。 –

1

あなたが最初の配列のため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]); 
+0

1,1,4は、最初の単語の後の1つのスペース、2番目の単語の後の1つのスペース、3番目の単語の後の4つのスペースを意味します。 – Haradzieniec

+0

@Haradzieniec私の編集を参照してください:) – silkfire

1

もう1つの方法は、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

ありがとう。しかし、スペースを収集しますが、単語間のスペースの数に関する情報は含まれません。 – Haradzieniec

2

次いでスプリット(したがってのみ空白)として捕捉されたセグメントを参照するために結果を解析し、文字列を分割し、一度正規表現を実行して、一つの方法である、又は単語であるもの:

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

あなたはfrom this demo$wordsことがある見ることができます:

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

そして$spacesは次のとおりです。

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

お返事ありがとうございました。私はあなたとAlma Do Mundo/silkfireの両方のソリューションをテストしました。すべてのソリューションは正常に動作しますが、Alma Do Mundoの作業は約2倍高速です。とにかくあなたのソリューションをありがとう。 もしあなたが欲しいのであれば、両方を比較することができます。 – Haradzieniec

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] =>は [2] => Aは [3] =>列 ) アレイ( [0] => 1 [1] => 1 [2] => 4 ) INT(1378392871) アレイ ( [0] =>この [1] =>は [2] => [3] =>列 ) アレイ( [0] => 1 [1] = > 1 [2] => 4 ) INT(1378392873)

4

$financialYear = 2015-2016;

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