爆炸不返回空字符串?

时间: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);