2013-09-05 6 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) पहला शब्द के बाद एक जगह है, दूसरा शब्द के बाद एक अंतरिक्ष और तीसरे शब्द के बाद 4 स्थानों का मतलब है।

क्या यह तेजी से करने का कोई तरीका है?

धन्यवाद।

+1

http://stackoverflow.com/questions/3432183/how-can-i-remove-all-empty -values-जब-ए-विस्फोट में एक स्ट्रिंग का उपयोग-php – Habib

+0

क्या आप रिक्त स्थान की संख्या या प्रत्येक स्थान की स्थिति चाहते हैं? –

+0

@JasonMcCreary वह प्रत्येक अंतरिक्ष समूह में लगातार रिक्त स्थान की संख्या चाहता है: '' '(1),' '(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

आपके उत्तर के लिए धन्यवाद। Howerer, आप बीच में रिक्त स्थान की संख्या के बारे में जानकारी खो देते हैं। इस सवाल में मैंने यही पूछा (कृपया बोल्ड टेक्स्ट देखें)। – Haradzieniec

+0

@ हाराडज़िएनिएक बस इसे टाइप कर रहा है, हां। धन्यवाद, मैंने अपडेट किया है। –

1

आप पहली सरणी के लिए preg_split() उपयोग कर सकते हैं:

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

औरके लिएसरणी:

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

1, 1, 4 का अर्थ है पहले शब्द के बाद एक स्थान, दूसरे शब्द के बाद एक स्थान और तीसरे शब्द के बाद 4 रिक्त स्थान। – Haradzieniec

+0

@Haradzieniec मेरा संपादन देखें :) – silkfire

1

ऐसा करने का एक और तरीका फ़ोरैच लूप का उपयोग करेगा।

$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

यहाँ स्ट्रिंग बंटवारे और एक regex एक बार चल रहा है, तो परिणाम पार्स करने को देखने के लिए कौन-से सेगमेंट (और इसलिए इसमें केवल रिक्त स्थान) विभाजन के रूप में कब्जा कर लिया गया एक ही रास्ता है, या कौन सा शब्द हैं:

$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

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैंने आपके और अल्मा दो मुंडो/रेशमफायर समाधान दोनों का परीक्षण किया है। सभी समाधान ठीक काम करते हैं, लेकिन अल्मा दो मुंडो का काम दो गुना तेज है। वैसे भी आपके समाधान के लिए धन्यवाद। यदि आप चाहें तो आप दोनों की तुलना कर सकते हैं (एक दूसरे में अपने प्रश्न पर मेरा उत्तर देखें)। – 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()); 

पूर्णांक (+१३७८३९२८७०) सरणी ( [0] => यह [1] => है [2] => एक [3] => स्ट्रिंग ) सरणी ( [0] => 1 [1] => 1 [2] => 4 ) पूर्णांक (+१३७८३९२८७१) 0,123,सरणी ( [0] => यह [1] => है [2] => एक [3] => स्ट्रिंग ) सरणी ( [0] => 1 [1] = > 1 [2] => 4 ) पूर्णांक (1378392873)

4

$financialYear = 2015-2016;

$test = explode('-',$financialYear); 
echo $test[0]; // 2015 
echo $test[1]; // 2016 
संबंधित मुद्दे