如何跳过空的数组项目内爆arrays?

Perl的join()忽略(跳过)空的数组值; PHP的implode()似乎没有。

假设我有一个数组:

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

收益率:

 one---four--six 

而不是(恕我直言,最好):

 one-four-six 

任何其他内置的行为,我正在寻找? 或者它会成为一个自定义的工作吗?

你可以使用array_filter()

如果没有提供callback ,则所有input等于FALSE条目(参见转换为布尔值 )将被删除。

 implode('-', array_filter($array)); 

显然这不会工作,如果你有你的数组中的0 (或任何其他值为false ),你想保留它。 但是你可以提供你自己的callback函数。

我想你不能认为它内置(因为函数是用用户定义的函数运行),但你总是可以使用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")); } 

基于我能find的,我会说机会是,没有任何方法可以使用内置的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。

但是,如果可以保证每个数组元素的string中不存在“粘合”字符(在大多数实际情况下这是给定的,否则您将无法区分)来自arrays中实际数据的胶水):

 $array = array('one', '', '', 'four', '', 'six'); $str = implode('-', $array); $str = preg_replace ('/(-)+/', '\1', $str); 

尝试这个:

 if(isset($array)) $array = implode(",", (array)$array);