Как я могу взорвать массив, пропуская пустые элементы массива?

Perl join() игнорирует (пропускает) пустые значения массива; PHP- implode() не отображается.

Предположим, у меня есть массив:

 $array = array('one', '', '', 'four', '', 'six'); implode('-', $array); 

выходы:

 one---four--six 

вместо (ИМХО предпочтительнее):

 one-four-six 

Любые другие встроенные функции с поведением, которое я ищу? Или это будет обычная работа?

Solutions Collecting From Web of "Как я могу взорвать массив, пропуская пустые элементы массива?"

Вы можете использовать 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);