How can you easily avoid getting this error/notice:
Notice: Undefined offset: 1 in /var/www/page.php on line 149
... in this code:
Want to mention a more general utility function that I use since decades. It filters out empty values and trims spaces. It also uses array_pad()
to make sure you get at least the requested amount of values (as suggested by @KingCrunch).
/**
* Does string splitting with cleanup.
* Added array_pad() to prevent list() complaining about undefined index
* @param $sep string
* @param $str string
* @param null $max
* @return array
*/
function trimExplode($sep, $str, $max = null)
{
if ($max) {
$parts = explode($sep, $str, $max); // checked by isset so NULL makes it 0
} else {
$parts = explode($sep, $str);
}
$parts = array_map('trim', $parts);
$parts = array_filter($parts);
$parts = array_values($parts);
$parts = array_pad($parts, $max, null);
return $parts;
}
I'd probably break this up into two steps
$split = explode('|', $value);
$func = $split[0];
if(count($split) > 1)
$field = $split[1];
else
$field = NULL;
There's probably a quicker and neater way though.
list($func, $field) = array_pad(explode('|', $value, 2), 2, null);
Two changes:
explode()
to 2. It seems, that no more than this is wantednull
until the array contains 2 values. See Manual: array_pad() for further informationThis means, if there is no |
in $value
, $field === null
. Of course you can use every value you like to define as default for $field
(instead of null
). Its also possible to swap the behavior of $func
and $field
list($func, $field) = array_pad(explode('|', $value, 2), -2, null);
Now $func
is null
, when there is no |
in $value
.
if (count(explode('|', $value))==2)
list($func, $field) = explode('|', $value);
However it's slightly not optimal.
I often come across this issue, so I wanted a function that allowed something nicer syntactically without unnecessarily padding the array or string.
// Put array entries in variables. Undefined index defaults to null
function toVars($arr, &...$ret)
{
$n = count($arr);
foreach ($ret as $i => &$r) {
$r = $i < $n ? $arr[$i] : null;
}
}
// Example usage
toVars(explode('|', $value), $func, $field);
For my purposes, I'm usually working with an array, but you could write a similar function that includes the explode function, like this...
// Explode and put entries in variables. Undefined index defaults to null
function explodeTo($delimiter, $s, &...$ret)
{
$arr = explode($delimier, $s);
$n = count($arr);
foreach ($ret as $i => &$r) {
$r = $i < $n ? $arr[$i] : null;
}
}
// Example usage
toVars('|', $value, $func, $field);
Requires PHP5.6 or above for variadic function: http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
This worked for me:
@list($func, $field) = explode('|', $value);