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