2015-04-17 85 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)')是否也会有性能成本。 –