Php,在数组中,0值
在下一个场景中,我试图理解数组中的Php,在数组中,0值,php,arrays,Php,Arrays,在下一个场景中,我试图理解数组中的行为: $arr = array(2 => 'Bye', 52, 77, 3 => 'Hey'); var_dump(in_array(0, $arr)); _array()中的返回值为布尔值true。正如您所看到的,no值等于0,因此,如果有人能帮助我理解函数返回true的原因吗?尝试将第三个参数true(严格模式)添加到\u数组中的调用中。根据中的注释,这是一个已知问题。考虑下面的例子: in_array(0, array(42));
行为:
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
_array()
中的返回值为布尔值true
。正如您所看到的,no值等于0
,因此,如果有人能帮助我理解函数返回true的原因吗?尝试将第三个参数true
(严格模式)添加到\u数组中的调用中。根据中的注释,这是一个已知问题。考虑下面的例子:
in_array(0, array(42)); // FALSE
in_array(0, array('42')); // FALSE
in_array(0, array('Foo')); // TRUE
为了避免这种情况,请提供第三个参数,true
,将比较置于严格模式,该模式不仅会比较值,还会比较类型:
var_dump(in_array(0, $arr, true));
存在其他不需要将每次检查置于严格模式的解决方案:
in_array($value, $my_array, empty($value) && $value !== '0');
但是为什么呢?
这一切背后的原因很有可能。如果我们试图从“Bye”中获取一个数字,我们将得到0
,这是我们要求查找的值
echo intval("Bye"); // 0
要确认这一点,我们可以使用array\u search
查找与匹配值关联的键:
在这种情况下,返回的键是2
,这意味着在将Bye
转换为整数时可以找到0
。In_数组应该用于索引数组([0]、[1]、[2]等),而不是使用您定义的字典(键值存储)
如果要检查数组$arr是否包含“0”,请尝试使用PHP函数array\u key\u exists-
这是一个松散的比较和分析的结果
松散比较意味着PHP在比较元素时使用的是==
而不是==
=
不比较两种变量类型是否相等,只比较它们的值,而==
将确保它们在类型和值上匹配(例如,比较0==FALSE
和0==FALSE
)
因此,基本上,您的in_数组函数正在检查:
0 == 'Bye'
0 == 'Hey'
0 == 77
请注意,由于您创建阵列的方式,52将丢失
因此,请注意,如果您这样做:
print (0 == 'Bye');
你会得到1。显然,PHP是0的“再见”,这与将字符串转换为int时发生的情况相同,例如,(int)'string'
将等于0。具体参考资料来源(重点增加):
该值由字符串的初始部分给出。如果字符串
从有效的数字数据开始,这将是使用的值。
否则,该值将为0(零)。有效的数字数据是
可选符号,后跟一个或多个数字(可选包含
小数点),后跟可选指数。指数是一个
“e”或“e”后跟一个或多个数字
显然,整数类型优先于字符串类型(也就是说,它可以通过将int 0转换为字符串来进行比较,然后返回False)。这在以下文件中有详细说明:
如果将数字与字符串进行比较,或者比较涉及
数字字符串,然后将每个字符串转换为一个数字
进行数值比较
谢谢你提出了一个有趣的问题,让我做了一些研究,学到了一些新东西 类型比较(第三个参数)需要更多的系统资源和时间。
简单地说:
$x=0;
$result=in_array($x.'',array('ABC','BAC','12c','54'));
var_dump($result);
我在这个数组中看到两个等于0的条目Hey Jonathan,谢谢你的回答真的很好,再次感谢,祝你有一天过得愉快。如果这个答案能解释为什么PHP的计算结果是0==“string”
,那就更好了是的,我只是不知道为什么。我在回答中公布了我的实验/结论,以及关于字符串转换为0的具体行,但感谢您的澄清。@ernie做得不错。我认为最自然的事情是利用array\u search
来查看PHP发现哪个值等于0
,而且确实是第一个字符串,它不是以数字开头的。这绝对是一个有趣的小问题-没有意识到在类型转换过程中字符串通常被转换为0,松散的字符串/数字比较将默认为数字比较。@ernie字符串“4u”在变戏法后将转换为4。但如果第一个字符不是数字,它将转换为0。绝对是一个有趣的问题。in_数组对数组是否索引没有限制;它所做的只是检查数组中的值(索引或散列)是否与指针匹配。感谢您的完整解释。我只是遇到了这篇文章的问题,无法理解PHP为什么要这么做。我不确定我将如何记住这一点,因为这感觉与PHP的工作方式完全相反。但有了你的充分解释,我的大脑就有机会“模糊地回忆”这些错误。感谢您花时间进行研究,以解决这一切!
print (0 == 'Bye');
$x=0;
$result=in_array($x.'',array('ABC','BAC','12c','54'));
var_dump($result);