Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php,在数组中,0值_Php_Arrays - Fatal编程技术网

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);