Функция разрыва 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" }
Попробуйте 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» отфильтровать.
Просто для разнообразия:
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 ().