ReynierPM ReynierPM - 1 month ago 6
PHP Question

Implode values from array with NULL or empty values cause unexpected output

I am trying to get the following output:

string1, string2, string3


Those values comes from
$var1
,
$var2
and
$var3
but they can be
NULL
at some point and here is where my problem is.

So far this is what I have:

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

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


This are the test I've run:

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: , ,


As you may notice if values are coming everything work as I want, if values are coming
NULL
then I am getting
, ,
when I what I want is just a
-
.

I have tried to find whether the array contains empty values or not using this code:

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


Then I've run the following test:

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

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

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

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


What I am missing or doing wrong here? How I can achieve this?

Answer

Filter the array before implode and if the imploded array is an empty string assign -, otherwise assign the imploded array:

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

For PHP < 5.3.0 not supporting ?: then:

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