Perl join()
игнорирует (пропускает) пустые значения массива; PHP- implode()
не отображается.
Предположим, у меня есть массив:
$array = array('one', '', '', 'four', '', 'six'); implode('-', $array);
выходы:
one---four--six
вместо (ИМХО предпочтительнее):
one-four-six
Любые другие встроенные функции с поведением, которое я ищу? Или это будет обычная работа?
Вы можете использовать array_filter()
:
Если обратный вызов не предоставляется, все записи ввода, равные
FALSE
(см. Преобразование в логическое ), будут удалены.
implode('-', array_filter($array));
Очевидно, что это не сработает, если в вашем массиве 0
(или любое другое значение, которое оценивается как false
), и вы хотите сохранить его. Но тогда вы можете предоставить свою собственную функцию обратного вызова.
Я полагаю, вы не можете считать его встроенным (потому что функция работает с определенной пользователем функцией), но вы всегда можете использовать array_filter .
Что-то вроде:
function rempty ($var) { return !($var == "" || $var == null); } $string = implode('-',array_filter($array, 'rempty'));
Как вы должны применять фильтр, зависит только от того, что вы видите как «пустое».
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")); }
Основываясь на том, что я могу найти, я бы сказал, есть вероятность, что на самом деле нет никакого способа использовать встроенный 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_fileter()
кажется приемлемым здесь и, вероятно, остается наиболее надежным ответом tbh.
Тем не менее, следующее будет работать, если вы можете гарантировать, что символ «клей» еще не существует в строках каждого элемента массива (который был бы дан в большинстве практических случаев), иначе вы не смогли бы отличить клей от фактических данных в массиве):
$array = array('one', '', '', 'four', '', 'six'); $str = implode('-', $array); $str = preg_replace ('/(-)+/', '\1', $str);
Попробуй это:
if(isset($array)) $array = implode(",", (array)$array);