php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #32865 explode do not works with $limit = null
Submitted: 2005-04-28 11:19 UTC Modified: 2021-03-04 13:21 UTC
From: dan at yes dot lt Assigned:
Status: Not a bug Package: Strings related
PHP Version: 5.0.4 OS: WinXP
Private report: No CVE-ID: None
 [2005-04-28 11:19 UTC] dan at yes dot lt
Description:
------------
explode() do not explodes string if $limit argument is null, but explodes if no $limit argument given.

Reproduce code:
---------------
print_r(explode(',', 'a,b,c'));
print_r(explode(',', 'a,b,c', null));

Expected result:
----------------
Array
(
   [0] => a
   [1] => b
   [2] => c
)
Array
(
   [0] => a
   [1] => b
   [2] => c
)


Actual result:
--------------
Array
(
   [0] => a
   [1] => b
   [2] => c
)
Array
(
   [0] => a,b,c
)


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2005-04-28 11:43 UTC] sniper@php.net
Yes, null == 0. (PHP is still loose typed language..)

 [2005-04-28 12:09 UTC] dan at yes dot lt
So what should I give to $limit to explode unlimited ???... As I know - in PHP no parameter means some default value - what default value is defined to default $limit ?..
 [2005-04-28 13:06 UTC] dan at yes dot lt
now I have to write..

if ($lim === null) {
    $parts = explode(',', $str);
} else {
    $parts = explode(',', $str, $lim);
}

..instead of..

$parts = explode(',', $str, $lim);

Isn't it some sort of crap ?..
 [2005-04-28 13:08 UTC] derick@php.net
No, it's how the language works. 
 [2011-02-10 20:46 UTC] chrisbloom7 at gmail dot com
while null does evaluate to 0 when compared, most other functions treat a NULL valued argument as though the argument did not exist, i.e. NULL == DEFAULT. The behaviour of explode to treat NULL as 0 comes back to bite us when we want to create a function that duplicates and extends explode's functionality. Consider the following:

function explode_and_trim($separator, $string, $limit = null)
{
  $a = explode($separator, $string, $limit);
  foreach ($a as $k => $v) {
    $a[$k] = trim($v);
  }
  return $a;
}

In that scenario, I cannot tell explode that there is NO limit unless I add a ridiculously unnecessary IF block to decide if it should or should not be called with the limit argument. NULL should be NULL, and regardless of whether PHP is loose typed or not, one can quite accurately test whether something is actually null (is_null($n)) or zero ($n === 0)
 [2021-03-04 11:55 UTC] restart at live dot nl
This is definitely a bug. 
16 years and this issue is still there.

The problem is this has not much to do with the loosely typing of PHP.
if a parameter defaults to null and you pass on a value of null you expect it to work the same.

Explode however treats the default value of the $limit parameter, which is null, different than a passed on value of null.
 [2021-03-04 13:21 UTC] nikic@php.net
This might have been incorrectly documented at some earlier point in time, but if you check the current documentation at https://www.php.net/explode, you'll find that the default value for $limit is PHP_INT_MAX, not null. If you want to replicate the default behavior, that is the value that you need to pass.

Null is very much not a "use the default" value. This is only true for parameters that use null as default (duh).
 [2021-03-07 16:05 UTC] restart at live dot nl
Ah sorry about that, thanks for the quick reply, in that case it definitely makes sense and it's as expected.

I should have checked the php.net page first, it seems the latest version of PHPStorm still has the wrong documentation stating the $limit parameter defaults to null. I'll try to notify them about it.
 [2021-03-08 18:08 UTC] restart at live dot nl
A short follow up on my previous comment;
They fixed it in the latest PHPStorm early access build. ^_^
 
PHP Copyright © 2001-2023 The PHP Group
All rights reserved.
Last updated: Thu Feb 09 12:05:50 2023 UTC