39

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"
}
4

13 回答 13

67

尝试preg_split

$exploded = preg_split('@/@', '1/2//3/', NULL, PREG_SPLIT_NO_EMPTY);

于 2008-09-15T16:48:28.110 回答
30

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

于 2008-09-15T16:49:53.020 回答
7

只为多样化:

array_diff(explode('/', '1/2//3/'), array(''))

这也有效,但与 preg_split 不同,它会弄乱数组索引。有些人可能更喜欢它,而不是必须声明一个回调函数才能使用 array_filter。

于 2008-09-15T17:14:16.160 回答
4
function not_empty_string($s) {
  return $s !== "";
}

array_filter(explode('/', '1/2//3/'), 'not_empty_string');
于 2008-09-15T16:48:07.563 回答
1

我在TYPO3中使用过这个,查看$onlyNonEmptyValues参数:

function trimExplode($delim, $string, $onlyNonEmptyValues=0){
    $temp = explode($delim,$string);
    $newtemp=array();
    while(list($key,$val)=each($temp))      {
        if (!$onlyNonEmptyValues || strcmp("",trim($val)))      {
            $newtemp[]=trim($val);
        }
    }
    reset($newtemp);
    return $newtemp;
}

它不会弄乱索引:

var_dump(trimExplode('/', '1/2//3/',1));

结果:

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}
于 2014-05-02T01:57:56.270 回答
1

这是一个应该输出新索引数组的解决方案。

$result = array_deflate( explode( $delim, $array) );

function array_deflate( $arr, $emptyval='' ){
    $ret=[];
    for($i=0,$L=count($arr); $i<$L; ++$i)
        if($arr[$i] !== $emptyval) $ret[]=$arr[$i];
    return $ret;
}

虽然与其他一些建议非常相似,但此实现具有通用使用的好处。对于具有非字符串元素的数组,提供一个类型化的空值作为第二个参数。

array_deflate( $objArray, new stdClass() );

array_deflate( $databaseArray, NULL );

array_deflate( $intArray, NULL );

array_deflate( $arrayArray, [] );

array_deflate( $assocArrayArray, [''=>NULL] );

array_deflate( $processedArray, new Exception('processing error') );

.

.

.

带有可选的过滤器参数..

function array_deflate( $arr, $trigger='', $filter=NULL, $compare=NULL){
    $ret=[];
    if ($filter === NULL) $filter = function($el) { return $el; };
    if ($compare === NULL) $compare = function($a,$b) { return $a===$b; };

    for($i=0,$L=count($arr); $i<$L; ++$i)
        if( !$compare(arr[$i],$trigger) ) $ret[]=$arr[$i];
        else $filter($arr[$i]);
    return $ret;
}

随着使用..

function targetHandler($t){ /* .... */ }    
array_deflate( $haystack, $needle, targetHandler );

将 array_deflate 变成一种处理选择元素并将它们从数组中删除的方法。更好的方法是将 if 语句转换为比较函数,该函数也作为参数传递,以防万一。

array_inflate相反,将采用一个额外的数组作为第一个参数,将匹配项推送到同时过滤不匹配项。

function array_inflate($dest,$src,$trigger='', $filter=NULL, $compare=NULL){
    if ($filter === NULL) $filter = function($el) { return $el; };
    if ($compare === NULL) $compare = function($a,$b) { return $a===$b; };

    for($i=0,$L=count($src); $i<$L; ++$i)
        if( $compare(src[$i],$trigger) ) $dest[]=$src[$i];
        else $filter($src[$i]);
    return $dest;
}

随着使用..

$smartppl=[];    
$smartppl=array_inflate( $smartppl,
                         $allppl,
                         (object)['intelligence'=>110],
                         cureStupid,
                         isSmart);

function isSmart($a,$threshold){
    if( isset($a->intellgence) )    //has intelligence?
        if( isset($threshold->intellgence) )    //has intelligence?
            if( $a->intelligence >= $threshold->intelligence )
                return true;
            else return INVALID_THRESHOLD; //error
        else return INVALID_TARGET; //error
    return false;
}

function cureStupid($person){
    $dangerous_chemical = selectNeurosteroid();
    applyNeurosteroid($person, $dangerous_chemical);

    if( isSmart($person,(object)['intelligence'=>110]) ) 
        return $person;
    else 
        lobotomize($person);

    return $person;
}

从而为世界教育问题提供了一种理想的算法。Aaand 在我将其调整为其他内容之前,我会停在那里。

于 2016-03-10T22:12:16.033 回答
0

编写一个包装函数来剥离它们

function MyExplode($sep, $str)
{
    $arr = explode($sep, $str);
    foreach($arr as $item)
        if(item != "")
            $out[] = $item;
    return $out;
}
于 2008-09-15T16:50:11.770 回答
0

我没有在这里测试其他建议,但这有效:

function different_explode($mypattern,$mystring){
    $array1 = explode($mypattern,$mystring);
    $retArray = Array();
    foreach($array1 as $myval){
        if($myval != ''){
            array_push($retArray,$myval);
        }
    }
    return $retArray;
}
于 2008-09-15T16:55:31.210 回答
0

使用此函数过滤explode函数的输出

  function filter_empty(&$arrayvar) {
        $newarray = array();
        foreach ($arrayvar as $k => $value)
            if ($value !== "")
                $newarray[$k] = $value;

        $arrayvar = $newarray;
    }
于 2008-09-15T17:02:48.807 回答
0

正则表达式解决方案往往比基本文本替换慢得多,所以我会用单个分隔符替换双分隔符,修剪任何空格的字符串,然后使用爆炸:

// assuming $source = '1/2//3/';
$source = str_replace('//', '/', $source);
$source = trim($source);
$parts = explode('/', $source);
于 2008-09-16T14:26:23.323 回答
0

没有正则表达式开销 - 应该相当有效,strlen 只计算字节数

如果您不关心索引,请删除 array_values()

如果你愿意,可以把它变成函数 explode_interesting( $array, $fix_index = 0 )

$interesting = array_values( 
                 array_filter(
                   explode('/', '/1//2//3///4/0/false' ),
                   function ($val) { return strlen($val); }
               ));

echo "<pre>", var_export( $interesting, true ), "</pre>";

享受,杰夫

于 2016-03-24T03:51:02.700 回答
-1

我通常将它包装在对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() 添加一个外包装调用。

于 2008-09-15T16:51:02.797 回答
-1

PHP的split函数与explode函数类似,只是它允许你输入一个正则表达式模式作为分隔符。大意是:

$exploded_arr = split('/\/+/', '1/2//3/');
于 2008-09-15T16:54:58.217 回答