Perljoin()
忽略(跳过)空数组值;PHP的implode()
似乎没有。
假设我有一个数组:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
产量:
one---four--six
而不是(恕我直言,更可取):
one-four-six
任何其他具有我正在寻找的行为的内置插件?或者它会成为一个定制的工作人员?
您可以使用array_filter()
:
如果没有提供回调,则所有等于(请参阅转换为 boolean )的输入条目都将被删除。
FALSE
implode('-', array_filter($array));
0
显然,如果您的数组中有(或任何其他计算为 的值false
)并且您想保留它,这将不起作用。但是您可以提供自己的回调函数。
我想您不能认为它是内置的(因为该函数正在使用用户定义的函数运行),但您始终可以使用array_filter。
就像是:
function rempty ($var)
{
return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
要删除null
, false
, empty
string 但保留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 )
你应该如何实现你的过滤器只取决于你看到的“空”。
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"));
}
$array = ["one", NULL, "two", NULL, "three"];
$string = implode("-", array_diff($array, [NULL]));
echo $string;
退货one-two-three
根据我能找到的,我想说机会是,实际上没有任何方法可以使用内置的 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()
似乎是这里公认的方式,并且可能仍然是最可靠的答案。
但是,如果您可以保证每个数组元素的字符串中不存在“胶水”字符(这在大多数实际情况下是给定的 - 否则您将无法区分),以下内容也将起作用来自数组中实际数据的胶水):
$array = array('one', '', '', 'four', '', 'six');
$str = implode('-', $array);
$str = preg_replace ('/(-)+/', '\1', $str);
尝试这个:
if(isset($array)) $array = implode(",", (array)$array);