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

时间:2016-11-22 16:36:38

标签: php arrays 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;
}

2 个答案:

答案 0 :(得分:2)

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。 (您可以查看答案here以获取更多有关该答案的说明。)

答案 1 :(得分:1)

end不返回最后一个,而是返回数组的最后一个。所以该行应为:

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

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