Explode, который не возвращает пустые строки?

Функция разрыва PHP возвращает массив строк, разделенных на некоторой предоставленной подстроке. Он будет возвращать пустые строки следующим образом:

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

Solutions Collecting From Web of "Explode, который не возвращает пустые строки?"

Попробуйте 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

Просто для разнообразия:

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

Это также работает, но беспорядок индексов массивов в отличие от preg_split. Некоторым людям это может понравиться лучше, чем объявить функцию обратного вызова для использования array_filter.

 function not_empty_string($s) { return $s !== ""; } array_filter(explode('/', '1/2//3/'), 'not_empty_string'); 

Я использовал это в 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" } 

Напишите функцию обертки, чтобы удалить их

 function MyExplode($sep, $str) { $arr = explode($sep, $str); foreach($arr as $item) if(item != "") $out[] = $item; return $out; } 

Я не тестировал другие предложения здесь, но это работает:

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

Решения регулярного выражения, как правило, намного медленнее, чем замена основного текста, поэтому я бы заменил двойных разделителей одиночными разделителями, обрезал строку любых пробелов и затем использовал взрыв:

 // assuming $source = '1/2//3/'; $source = str_replace('//', '/', $source); $source = trim($source); $parts = explode('/', $source); 

Вот решение, которое должно выводить новый индексированный массив.

 $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 являющийся обратным, возьмет дополнительный массив, поскольку первый параметр, который соответствует, будет 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, я остановлюсь там, прежде чем я подкорректирую это во что-то еще.

Нет избыточных ресурсов регулярных выражений – должно быть достаточно эффективным, 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>"; 

наслаждаться, Джефф

Функция разделения PHP похожа на функцию разрыва , за исключением того, что она позволяет вводить шаблон регулярного выражения в качестве разделителя. Что-то вроде:

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

Обычно я обертываю его вызовом 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 ​​().