2008-09-15 134 views
28

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

回答

53

尝试preg_split

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

+1

我认为这是最正确的,因为它维护正确的数组索引。 – 2008-09-15 17:18:59

+0

@Ryono:你究竟是什么意思? – 2008-10-30 15:17:45

+5

preg_split将返回一个具有顺序数组索引的数组(即0,1,2,3)。其他一些使用array_filter的建议将会返回非连续的数组索引,因为一些元素被过滤掉了,并且剩下像0,1,3,7这样的数组索引。 – 2009-08-18 16:23:50

4
function not_empty_string($s) { 
    return $s !== ""; 
} 

array_filter(explode('/', '1/2//3/'), 'not_empty_string'); 
+0

注:这是比 '裸装' 最好打个电话给array_filter(),如果你可能有 “1/2 // 0/3”,并希望至保持零。 – 2008-09-15 16:54:57

+0

好评。我想要建议'裸'的电话,但是,它会抛出零。 – Jrgns 2008-09-15 22:04:54

17

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

0

写包装函数剥去它们

function MyExplode($sep, $str) 
{ 
    $arr = explode($sep, $str); 
    foreach($arr as $item) 
     if(item != "") 
      $out[] = $item; 
    return $out; 
} 
-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()。

-1

PHP的split function与爆炸函数类似,只是它允许您输入正则表达式模式作为分隔符。东西的效果:

$exploded_arr = split('/\/+/', '1/2//3/'); 
0

我没有测试过这里的其他建议,但这个工程:

function different_explode($mypattern,$mystring){ 
    $array1 = explode($mypattern,$mystring); 
    $retArray = Array(); 
    foreach($array1 as $myval){ 
     if($myval != ''){ 
      array_push($retArray,$myval); 
     } 
    } 
    return $retArray; 
} 
0

使用此功能来筛选爆炸函数的输出

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

     $arrayvar = $newarray; 
    } 
6

只是为了多种:

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

这也适用,但不像preg_split那样混乱了数组索引。有些人可能比不必声明回调函数来使用array_filter更好。

0

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

// assuming $source = '1/2//3/'; 
$source = str_replace('//', '/', $source); 
$source = trim($source); 
$parts = explode('/', $source); 
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" 
} 
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我会在我把它变成别的东西之前停下来。

0

没有正则表达式的开销 - 要合理有效,strlen的只是计数字节

降array_values(),如果你不关心指数

使之成为功能explode_interesting($数组$ 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>"; 

享受,杰夫