使用 NULL 或空值从数组中内爆值会导致意外输出
Implode values from array with NULL or empty values cause unexpected output
我正在尝试获得以下输出:
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
,那么我得到的是 , ,
,而我想要的只是一个 -
.
我尝试使用以下代码查找数组是否包含空值:
$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
我在这里遗漏了什么或做错了什么?我怎样才能做到这一点?
如果你想要-
,那么这是错误的:
echo $arr !== '' ? implode(', ', $arr) : '-';
^^^^^^^^^^^
数组不是字符串,如果将数组与字符串进行比较,数组将转换为字符串,并变成字面词 Array
。这意味着你在做
echo 'Array' !== '' ? ...
当然,它们并不相等,您最终会走 implode
道路。
您必须测试数组的各个值是否为 null,然后再决定要做什么。请注意 array_count_values()
在这里不起作用 - 它只能计算 string/integer 值。 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
}
内爆前过滤数组,如果内爆数组为空字符串赋值-
,否则赋值内爆数组:
$result = implode(', ', array_filter($arr)) ?: '-';
对于 PHP < 5.3.0 不支持 ?:
那么:
$result = ($s = implode(', ', array_filter($arr))) ? $s : '-';
我正在尝试获得以下输出:
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
,那么我得到的是 , ,
,而我想要的只是一个 -
.
我尝试使用以下代码查找数组是否包含空值:
$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
我在这里遗漏了什么或做错了什么?我怎样才能做到这一点?
如果你想要-
,那么这是错误的:
echo $arr !== '' ? implode(', ', $arr) : '-';
^^^^^^^^^^^
数组不是字符串,如果将数组与字符串进行比较,数组将转换为字符串,并变成字面词 Array
。这意味着你在做
echo 'Array' !== '' ? ...
当然,它们并不相等,您最终会走 implode
道路。
您必须测试数组的各个值是否为 null,然后再决定要做什么。请注意 array_count_values()
在这里不起作用 - 它只能计算 string/integer 值。 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
}
内爆前过滤数组,如果内爆数组为空字符串赋值-
,否则赋值内爆数组:
$result = implode(', ', array_filter($arr)) ?: '-';
对于 PHP < 5.3.0 不支持 ?:
那么:
$result = ($s = implode(', ', array_filter($arr))) ? $s : '-';