Ответ 1
Попробуйте preg_split.
$exploded = preg_split('@/@', '1/2//3/', NULL, PREG_SPLIT_NO_EMPTY);
Функция 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"
}
Попробуйте 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
)
Вы получите все значения, которые разрешены для "ложных" отфильтрованных.
Просто для разнообразия:
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;
}
Регламенты регулярного выражения, как правило, намного медленнее, чем замена основного текста, поэтому я бы заменил двойных разделителей одиночными разделителями, обрезал строку любых пробелов и затем использовал explode:
// 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
будет обратным, возьмет дополнительный массив, так как первый параметр, который соответствует, будет нажат, пока не будут отфильтрованы несоответствия.
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>";
наслаждайтесь, Джефф
Я обычно обертываю его при вызове 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 ().
PHP функция разделения похожа на функцию разрыва, за исключением того, что она позволяет вводить шаблон регулярного выражения в качестве разделителя. Что-то вроде:
$exploded_arr = split('/\/+/', '1/2//3/');