Perl的join()
忽略(跳过)空数组值; PHP implode()
似乎没有。
假设我有一个数组:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
的产率:
one---four--six
而不是(恕我直言):
one-four-six
我正在寻找的任何其他内置插件?或者它会成为一个自定义的职业?
答案 0 :(得分:182)
您可以使用array_filter()
:
如果未提供回调,则输入的所有条目等于
FALSE
(请参阅converting to boolean)被删除。
implode('-', array_filter($array));
显然,如果你的数组中有0
(或任何其他值为false
的值)并且你想保留它,那么这将不起作用。但是你可以提供自己的回调功能。
答案 1 :(得分:8)
我认为您无法考虑内置(因为该功能是使用用户定义的函数运行的),但您始终可以使用array_filter。 类似的东西:
function rempty ($var)
{
return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
答案 2 :(得分: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"));
}
答案 3 :(得分:2)
要删除null
,false
,empty
字符串,但保留0
等,请使用func。 'strlen
'
$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));
将输出:
//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
答案 4 :(得分:1)
根据我能找到的内容,我会说机会是,没有任何方法可以使用内置的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 :(得分:1)
试试这个:
$result = array();
foreach($array as $row) {
if ($row != '') {
array_push($result, $row);
}
}
implode('-', $result);
答案 6 :(得分:1)
$array = ["one", NULL, "two", NULL, "three"];
$string = implode("-", array_diff($array, [NULL]));
echo $string;
返回one-two-three
答案 7 :(得分:0)
array_fileter()
似乎是可接受的方式,并且可能仍然是最强大的答案。
但是,如果您可以保证每个数组元素的字符串中不存在“粘合”字符,那么以下内容也会起作用(在大多数实际情况下这将是给定的 - 否则您将不会能够区分胶水与阵列中的实际数据):
$array = array('one', '', '', 'four', '', 'six');
$str = implode('-', $array);
$str = preg_replace ('/(-)+/', '\1', $str);
答案 8 :(得分:-3)
试试这个:
if(isset($array)) $array = implode(",", (array)$array);