Perl\'s join()
ignores (skips) empty array values; PHP\'s implode()
does not appear to.
Suppose I have an array:
$array = a
You can use array_filter():
If no callback is supplied, all entries of input equal to
FALSE
(see converting to boolean) will be removed.
implode('-', array_filter($array));
Obviously this will not work if you have 0
(or any other value that evaluates to false
) in your array and you want to keep it. But then you can provide your own callback function.
To remove null
, false
, empty
string but preserve 0
, etc. use func. 'strlen
'
$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));
will output:
//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
I suppose you can't consider it built in (because the function is running with a user defined function), but you could always use array_filter.
Something like:
function rempty ($var)
{
return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));
array_fileter()
seems to be the accepted way here, and is probably still the most robust answer tbh.
However, the following will also work if you can guarantee that the "glue" character doesn't already exist in the strings of each array element (which would be a given under most practical circumstances -- otherwise you wouldn't be able to distinguish the glue from the actual data in the array):
$array = array('one', '', '', 'four', '', 'six');
$str = implode('-', $array);
$str = preg_replace ('/(-)+/', '\1', $str);
How you should implement you filter only depends on what you see as "empty".
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;
Returns one-two-three