2008-09-15 122 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>"; 

享受,傑夫