【问题标题】:Undefined offset despite array_key_exists() check尽管 array_key_exists() 检查未定义的偏移量
【发布时间】:2016-11-23 00:57:24
【问题描述】:

在函数中使用下面的代码时($floor$lift 已传入,但我已在此处添加它们以进行演示)我在最后一个 return 语句中得到一个 Notice: Undefined offset: 20

最后一个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( $moving["no_lift"] ) 将是 20。哪个不存在。
  • 您试图通过键访问数组,但您实际上是在使用值!
  • 也许您正在尝试使用 array_key_exists 来搜索值。您需要改用 array_search。
  • array_key_exists 函数仅适用于关联数组。对于顺序数组,请使用 count 函数。

标签: php arrays array-key-exists


【解决方案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']);
}

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

【讨论】:

  • 谢谢你 - 显然是我对文档的误解。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢你 - 显然是我对文档的误解。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 2011-03-13
  • 2015-10-12
  • 2022-01-02
  • 2013-01-25
  • 2011-07-22
  • 2014-10-01
相关资源
最近更新 更多