How to avoid undefined offset

后端 未结 8 2182
梦谈多话
梦谈多话 2020-12-13 05:24

How can you easily avoid getting this error/notice:

Notice: Undefined offset: 1 in /var/www/page.php on line 149

... in this code:

相关标签:
8条回答
  • 2020-12-13 06:06

    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;
    }
    
    0 讨论(0)
  • 2020-12-13 06:08

    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.

    0 讨论(0)
  • 2020-12-13 06:21
    list($func, $field) = array_pad(explode('|', $value, 2), 2, null);
    

    Two changes:

    • It limits the size of the array returned by explode() to 2. It seems, that no more than this is wanted
    • If there are fewer than two values returned, it appends null until the array contains 2 values. See Manual: array_pad() for further information

    This 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.

    0 讨论(0)
  • 2020-12-13 06:22
    if (count(explode('|', $value))==2)
      list($func, $field) = explode('|', $value);
    

    However it's slightly not optimal.

    0 讨论(0)
  • 2020-12-13 06:22

    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

    0 讨论(0)
  • 2020-12-13 06:27

    This worked for me:

    @list($func, $field) = explode('|', $value);
    
    0 讨论(0)
提交回复
热议问题