Perl join()
игнорирует (пропускает) значения пустого массива; PHP implode()
не похоже.
Предположим, у меня есть массив:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
дает:
one---four--six
вместо (ИМХО предпочтительнее):
one-four-six
Есть ли другие встроенные модули с тем поведением, которое я ищу? Или это будет заказная работа?
join
не пропускает неопределенные элементы. Фактически, они приводят к предупреждению.$a[0]="a"; $a[2]="c"; say join "-",@a;
отображаетUse of uninitialized value within @a in join or string
иa--c
. Можно использоватьjoin '-', grep !defined, ...
для пропуска неопределенных значений.grep !length,
будет делать пустые строки.Ответы:
Вы можете использовать
array_filter()
:implode('-', array_filter($array));
Очевидно, это не сработает, если у вас есть
0
(или любое другое значение, которое оцениваетсяfalse
) в вашем массиве, и вы хотите его сохранить. Но тогда вы можете предоставить свою собственную функцию обратного вызова.источник
false
и0
также выброшены?empty
, когда вы его используете, также будет обрабатывать0
иfalse
какfalse
(и удалять), кстати.array_filter()
помощью фильтров по умолчанию выключено каждыйfalse
,null
пустая строка ( «») и0
.false
: пустой массив,0.0
и"0"
.Я полагаю, вы не можете считать его встроенным (потому что функция работает с пользовательской функцией), но вы всегда можете использовать array_filter .
Что-то типа:
function rempty ($var) { return !($var == "" || $var == null); } $string = implode('-',array_filter($array, 'rempty'));
источник
empty
имеет тот же эффект, что и полное отсутствие обратного вызова. Изменить: вы должны отрицать возвращаемое значение. В противном случае будут возвращены только пустые элементы;) (на самом деле использование,empty
как вы делали раньше, тоже было неправильным)implode('-', array_filter($ary, create_function('$a', 'return $a!="";')));
Как вы должны реализовать свой фильтр, зависит только от того, что вы видите «пустым».
function my_filter($item) { return !empty($item); // Will discard 0, 0.0, '0', '', NULL, array() of FALSE // Or... return !is_null($item); // Will only discard NULL // or... return $item != "" && $item !== NULL; // Discards empty strings and NULL // or... whatever test you feel like doing } function my_join($array) { return implode('-',array_filter($array,"my_filter")); }
источник
Для того, чтобы удалить
null
,false
,empty
строка , но сохранить0
и т.д. использовать FUNC. 'strlen
'$arr = [null, false, "", 0, "0", "1", "2", "false"]; print_r(array_filter($arr, 'strlen'));
выведет:
//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
источник
Основываясь на том, что я могу найти, я бы сказал, что, скорее всего, на самом деле нет никакого способа использовать для этого встроенный PHP. Но вы, вероятно, могли бы сделать что-то вроде этого:
function implode_skip_empty($glue,$arr) { $ret = ""; $len = sizeof($arr); for($i=0;$i<$len;$i++) { $val = $arr[$i]; if($val == "") { continue; } else { $ret .= $arr.($i+1==$len)?"":$glue; } } return $ret; }
источник
Попробуй это:
$result = array(); foreach($array as $row) { if ($row != '') { array_push($result, $row); } } implode('-', $result);
источник
$array = ["one", NULL, "two", NULL, "three"]; $string = implode("-", array_diff($array, [NULL])); echo $string;
Возврат
one-two-three
источник
array_fileter()
кажется здесь принятым способом и, вероятно, все еще самым надежным ответом.Однако следующее также будет работать, если вы можете гарантировать, что символ «клея» еще не существует в строках каждого элемента массива (что было бы задано в большинстве практических обстоятельств - иначе вы не сможете различить клей из реальных данных в массиве):
$array = array('one', '', '', 'four', '', 'six'); $str = implode('-', $array); $str = preg_replace ('/(-)+/', '\1', $str);
источник
Попробуй это:
if(isset($array)) $array = implode(",", (array)$array);
источник
isset()
или приведение входного массива в соответствие сarray
любыми проблемами исходного сообщения?