Wednesday, August 5, 2009

strtok in PHP - a common mistake

strtok, that splits a string into tokens is a very useful function for the programmers. Here is an example code that shows the use of strtok function to extract integers from a comma separated string.

$list = "1,2,4,10,8,0,20,30,9";

$token = strtok($list, ",");
while($token)
{
print $token."\n";
$token = strtok(",");
}
?>

Using the code we get this output:

1
2
4
10
8

Where are the other four integers? Actually when the value of $token is zero (0) - the sixth integer in the list, while ($token) evaluates to False and the loop is broken there. Lets use while($token != FALSE) instead.

$token = strtok($list, ",");
while($token != FALSE)
{
print $token."\n";
$token = strtok(",");
}

Still the same output. Oh, the mistake is we used the '!=' operator which tests the equality between $token and FALSE. Here zero (0) is equal to FALSE. A stupid way to avoid the problem is to calculate the length - while(strlen($token)) and it will work definitely! as the length of the string '0' is 1. But best solution (to me) is to use the '!==' operator which means not identical. So the following code works fine:

$list = "1,2,4,10,8,0,20,30,9";

$token = strtok($list, ",");
while($token !== FALSE)
{
print $token."\n";
$token = strtok(",");
}
?>

Output:

1
2
4
10
8
0
20
30
9

It's always useful to know details about operators in PHP.