如何在跳过空数组项的同时内爆数组?

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

假设我有一个数组:

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

收益率:

one---four--six

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

one-four-six

还有什么其他内置的行为我正在寻找? 或者它将是一个定制的工作吗?

52585 次浏览

You can use 强 > array_filter():

如果没有提供 复试,则将删除所有等于 FALSE输入条目(参见 转换为布尔型)。

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

显然,如果数组中有 0(或任何其他计算结果为 false的值) ,并且希望保留它,那么这种方法将不起作用。但是您可以提供自己的回调函数。

I suppose you can't consider it built in (because the function is running with a user defined function), but you could always use Array _ filter 数组过滤器.
比如:

function rempty ($var)
{
return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));

基于我所能找到的,我认为可能的情况是,没有任何方法可以使用内置的 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);

您应该如何实现筛选只取决于您所看到的“空”。

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"));
}

试试这个:

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

array_fileter()似乎是这里可以接受的方式,而且可能仍然是最稳健的答案。

然而,如果你能保证每个数组元素的字符串中不存在“胶水”字符(在大多数实际情况下这是给定的——否则你将无法从数组中的实际数据中区分出胶水) ,下面的方法也可以起作用:

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

要删除 nullfalseempty字符串,但保留 0等使用函数 strlen

$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));

will output:

//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
$array = ["one", NULL, "two", NULL, "three"];
$string = implode("-", array_diff($array, [NULL]));
echo $string;

返回 one-two-three