尽管 array_key_exists() 检查未定义的偏移量

Undefined offset despite array_key_exists() check

当在函数中使用下面的代码时($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;
}

end return 是数组中的最后一个 ,所以

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

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

两者实际上都是

$moving["no_lift"][ 20 ]

如果您打算在数组中查找某些内容,并且 return 如果未找到最后一项,则可以使用 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']);
}

如果数组中的某些值可能是 null,您可以使用 array_key_exists 而不是 isset。 (您可以查看答案 here 以获得更多相关描述。)

end 不是 return 最后一个 key,而是数组的最后一个 value。所以该行应该是:

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

(但是这仍然假定 $moving['no_lift'] 是一个数组。)