1

When using the code below in a function ($floor & $lift are passed in but I've added them here for demonstration) I'm getting an Notice: Undefined offset: 20 on the last return statement.

The last return is the mean that's mean to be used in this example but why am I getting the Notice: Undefined offset: 20? If I'm not mistake (which I clearly am) the array_key_exists() function should be preventing this? I've also tried it with isset() with no success.

$floor = 20;
$lift = false;

$moving = array(
    "no_lift" => array(
        1 => 0,
        2 => 13,
        3 => 17,
        4 => 20
    ),
    "lift"    => array(
        1 => 0,
        2 => 10,
        3 => 10,
        4 => 20
    )
);

switch ( $lift ) {
    case true:
        return ( isset( $moving["lift"][ $floor ] ) ? $moving["lift"][ $floor ] : $moving["lift"][ end( $moving["lift"] ) ] );
        break;
    case false:
        return ( array_key_exists( $floor, $moving["no_lift"] ) ? $moving["no_lift"][ $floor ] : $moving["no_lift"][ end( $moving["no_lift"] ) ] );
        break;
}
Neil Nand
  • 549
  • 6
  • 25

2 Answers2

2

end returns the last value from an array, so

$moving["lift"][ end( $moving["lift"] ) ]

and

$moving["no_lift"][ end( $moving["no_lift"] ) ]

will both be, in effect,

$moving["no_lift"][ 20 ]

If you are intending to look for something in the array and return the last item if it isn't found, you can use in_array if you're looking for a value

if ($lift) {
    return in_array($floor, $moving['lift']) ? $floor : end($moving['lift']);
} else {
    return in_array($floor, $moving['no_lift']) ? $floor : end($moving['no_lift']);
}

or isset if you're looking for a key.

if ($lift) {
    return isset($floor, $moving['lift']) ? $moving['lift'][$floor] : end($moving['lift']);
} else {
    return isset($floor, $moving['no_lift']) ? $moving['no_lift'][$floor] : end($moving['no_lift']);
}

You can use array_key_exists rather than isset if some of the values in the array may be null. (You can check the answers here for a bit more of a description about that.)

Community
  • 1
  • 1
Don't Panic
  • 41,125
  • 10
  • 61
  • 80
1

end does not return the last key, but the last value of an array. So the line should read:

return ( array_key_exists( $floor, $moving["no_lift"] ) ? $moving["no_lift"][ $floor ] : end( $moving["no_lift"] );

(However that still presumes that $moving['no_lift'] is an array.)

giraff
  • 4,601
  • 2
  • 23
  • 35