Неопределенное смещение, несмотря на проверку array_key_exists ()

При использовании кода ниже в функции ($floor & $lift переданы, но я добавил их сюда для демонстрации) Я получаю Notice: Undefined offset: 20 на последнем return заявление.

Последний return это среднее значение, которое должно быть использовано в этом примере, но почему я получаю Notice: Undefined offset: 20? Если я не ошибаюсь array_key_exists() функция должна предотвращать это? Я также попробовал это с isset() без успеха.

$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;
}

1

Решение

end возвращает последний значение из массива, так

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

а также

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

оба будут, по сути,

$moving["no_lift"][ 20 ]

Если вы собираетесь искать что-то в массиве и возвращать последний элемент, если он не найден, вы можете использовать in_array если вы ищете значение

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']);
}

или же isset если вы ищете ключ.

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']);
}

Ты можешь использовать array_key_exists скорее, чем isset если некоторые из значений в массиве могут быть null, (Вы можете проверить ответы Вот немного больше описания об этом.)

2

Другие решения

end не возвращает последний ключ, но последний значение массива. Поэтому строка должна выглядеть так:

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

(Однако это все еще предполагает, что $moving['no_lift'] это массив.)

1