比较关联数组的键数组与整数索引数组

5
我已经编写了以下代码来检查数组是否是关联数组
function is_associative( $arr ) {
    $arr = array_keys( $arr );
    return $arr != array_keys( $arr );
}

它将返回以下类型的数组:

array("a" => 5,"b" => 9);

对于数字数组,该函数返回 false。

但是,对于仅有一个元素的关联数组,它不会返回 true,例如:

array("a" =>9);

为什么关联数组中只有一个元素时返回false?
1个回答

8
您需要在比较中使用 !==
return $arr !== array_keys( $arr );

这将生成正确的输出,表明两个值都为真。

否则,类型转换将认为单元素数组的值相等:

array(1) { [0]=> string(1) "a" } 
array(1) { [0]=> int(0) }

在这里,"a" == 0 是成立的(因为 "a" 被默默地转换为 0),但是 "a" === 0 是不成立的。


它们为什么在单元素数组时不是相同类型的? - Jinu Joseph Daniel
1
@JinuJD - 我已经更新了我的答案,并更清晰地描述了发生了什么。 - nickb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接