如何跳过空的数组项目内爆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);