具有NULL或空值的数组中的Implode值会导致意外输出

时间:2016-10-25 18:34:21

标签: php implode

我想获得以下输出:

string1, string2, string3

这些值来自$var1$var2$var3,但在某些时候它们可能是NULL,这就是我的问题所在。

到目前为止,这就是我所拥有的:

$arr = array(
    $var1 !== null ? $var1 : '',
    $var2 !== null ? $var2 : '',
    $var3 !== null ? $var3 : '',
);

echo $arr !== '' ? implode(', ', $arr) : '-';

这是我运行的测试:

input: array('string1', 'string2', 'string3')
output: string1, string2, string3

input: array('string1', 'string2')
output: string1, string2

input: array('', '', '')
output: , ,

input: array(null, null, null)
output: , ,

正如您可能会注意到,如果值即将到来,一切都按照我的意愿运行,如果值即将到来NULL,那么当我想要的只是, ,时,我得到-。< / p>

我试图找到数组是否包含空值或不使用此代码:

$cnt = count($arr) !== count(array_filter($arr, "strlen"));
echo $cnt;

然后我进行了以下测试:

input: array('string1', 'string2', 'string3')
output: 3

input: array('string1', 'string2')
output: 2

input: array('', '', '')
output: 1

input: array(null, null, null)
output: 1

我在这里错过了什么或做错了什么?我怎么能做到这一点?

2 个答案:

答案 0 :(得分:3)

如果你想要-,那就错了:

echo $arr !== '' ? implode(', ', $arr) : '-';
     ^^^^^^^^^^^

数组不是字符串,如果将数组与字符串进行比较,则数组将转换为字符串,并转换为文字Array。这意味着你正在做

echo 'Array' !== '' ? ...

当然,这些并不相同,你最终走向implode路径。

您必须测试数组的各个值是否为null,然后决定要执行的操作。请注意array_count_values()在这里不起作用 - 它只能计算字符串/整数值。 null作为值不可数。

php > $arr = array(null, null);
php > var_dump(array_count_values($arr));
PHP Warning:  array_count_values(): Can only count STRING and INTEGER values! in php shell code on line 1
PHP Warning:  array_count_values(): Can only count STRING and INTEGER values! in php shell code on line 1
array(0) {
}

所以你必须这么做:

$cnt = 0;
foreach($arr as $key => $value) {
    if (is_null($value)) { $cnt++; }
}
if ($cnt == count($arr)) {
   ... array is all nulls
}

答案 1 :(得分:3)

在内爆之前过滤数组,如果内爆数组为空字符串,则分配-,否则分配内爆数组:

$result = implode(', ', array_filter($arr)) ?: '-';

对于PHP&lt; 5.3.0当时不支持?:

$result = ($s = implode(', ', array_filter($arr))) ? $s : '-';