2015-04-17 176 views
4

我一直在試圖創造條件,採取一個字符串 做這與它的功能 - 如果提交的字符串是的「HelloWorld:GoodbyeWorld」的功能,將創建一個數組,其內容會的HelloWorld和GoodbyeWorld ,所以 (「HelloWorld」,「GoodbyeWorld」)。這是我的代碼。如何在PHP中分割字符串?

function parseBadges($str) { 
    $realstr=$str; 
    $badges = array(); 
    while(strpos($realstr, ':') !== false) { 
     array_push($badges, substr(0, strpos($realstr,':'))); 
     $realstr = substr(0, strpos($realstr, ':')); 
    } 
    return badges; 
} 

嘗試var_dump(parseBadges(「FavoerDoer:」));返回

array(1) { [0]=> bool(false) } 

不知道爲什麼會發生這種情況,有什麼想法?

+0

例如,如果你做parseBadges( 'ABC1:ABC2:ABC3:'),它應該返回一個數組( 「ABC1」 「abc2」,「abc3」) –

+1

只是爲了讓你知道,儘管有很好的解釋,你接受的答案對'abc1:abc2:abc3:'最後一場比賽將是空白的。 –

回答

4

它不起作用,因爲您正在以複雜的方式執行一項簡單的任務。 請考慮:

function parse_badges($str) { 
    return (is_string($str))?explode(':',$str):false; 
} 

說明:

  1. 函數需要一個字符串=>$str
  2. 如果傳遞的變量不是字符串返回false =>(is_string)? ... :false;
  3. 如果它是一個字符串explode()將分裂您選擇的字符您的字符串,並返回一個包含子字符串數組。

更多閱讀:PHP explode()

編輯

如果你想避免空的結果就像word1:word2:,將返回的3數組的最後一個單元格是空的。我們可以簡單地添加array_filter()

function parse_badges($str) { 
    return (is_string($str))?array_filter(explode(':',$str)):false; 
} 

array_filter將默認刪除空細胞。

+0

謝謝。不能相信PHP有它的功能。要標記爲5分鐘回答 –

+0

其實它的共同點。在JS中,在PHP中調用'split()'時,'explode()'的負值是'implode()'。玩的開心! –

+1

最好的答案得益於解釋... –

0
function parseBadges($str) 
    if(strpos($str, ':') !== false) 
     $badges = explode(':', $str); 
     return $badges; 
    } 

    return false; 
} 
print_r($badges); 
1
$str= "HelloWorld:GoodbyeWorld:HiThere:"; 

function parseBadges($str) { 
    return preg_split('/:/i', $str, null, PREG_SPLIT_NO_EMPTY); 
} 

print_r(parseBadges($str)); 

輸出:

(
    [0] => HelloWorld 
    [1] => GoodbyeWorld 
    [2] => HiThere 
) 

DEMO

+1

正確 - 但爲了這麼簡單的任務,爲什麼轉向正則表達式 - 有一個性能成本:[explode vs preg_split](http://micro-optimization.com/explode-vs-preg_split.html) –

+0

@ShomiHassid如果你需要檢查'if(EMPTY($ string)')是否也會有性能成本。 –