爆炸不返回空字符串?
时间:2020-03-05 18:53:56 来源:igfitidea点击:
PHP的explode函数返回在提供的某些子字符串上拆分的字符串数组。它将返回空字符串,如下所示:
var_dump(explode('/', '1/2//3/')); array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(0) "" [3]=> string(1) "3" [4]=> string(0) "" }
是否有一些不同的函数或者选项,或者什么可以返回除空字符串以外的所有内容?
var_dump(different_explode('/', '1/2//3/')); array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }
解决方案
回答
function not_empty_string($s) { return $s !== ""; } array_filter(explode('/', '1/2//3/'), 'not_empty_string');
回答
尝试preg_split。
$ exploded = preg_split('@ / @','1/2 // 3 /',NULL,PREG_SPLIT_NO_EMPTY);`
回答
array_filter将删除空白字段,这是一个没有过滤器的示例:
print_r(explode('/', '1/2//3/'))
印刷:
Array ( [0] => 1 [1] => 2 [2] => [3] => 3 [4] => )
使用过滤器:
php> print_r(array_filter(explode('/', '1/2//3/')))
印刷:
Array ( [0] => 1 [1] => 2 [3] => 3 )
我们将过滤掉所有解析为" false"的值。
参见http://uk.php.net/manual/en/function.array-filter.php
回答
编写包装函数以剥离它们
function MyExplode($sep, $str) { $arr = explode($sep, $str); foreach($arr as $item) if(item != "") $out[] = $item; return $out; }
回答
我通常将其包装在对array_filter的调用中,例如
var_dump(array_filter(explode('/', '1/2//3/')) => array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [3]=> string(1) "3" }
当然要知道,阵列键是可以维护的。如果我们不希望这种行为,请记住将外部包装调用添加到array_values()。
回答
PHP的split函数类似于explode函数,不同之处在于它允许我们输入正则表达式模式作为分隔符。效果:
$exploded_arr = split('/\/+/', '1/2//3/');
回答
我没有在这里测试其他建议,但这可行:
function different_explode($mypattern,$mystring){ $array1 = explode($mypattern,$mystring); $retArray = Array(); foreach($array1 as $myval){ if($myval != ''){ array_push($retArray,$myval); } } return $retArray; }
回答
使用此功能过滤爆炸功能的输出
function filter_empty(&$arrayvar) { $newarray = array(); foreach ($arrayvar as $k => $value) if ($value !== "") $newarray[$k] = $value; $arrayvar = $newarray; }
回答
只是为了多样性:
array_diff(explode('/', '1/2//3/'), array(''))
这也可以,但是不像preg_split那样弄乱了数组索引。某些人可能更喜欢它,而不必声明使用array_filter的回调函数。
回答
正则表达式解决方案通常比基本文本替换要慢得多,因此我将用单个分隔符替换双分隔符,修剪所有空格的字符串,然后使用explode:
// assuming $source = '1/2//3/'; $source = str_replace('//', '/', $source); $source = trim($source); $parts = explode('/', $source);