echo in_array('01',array('1'))
在使用in_array不采用strict时,为什么返回1,怎么判断的?
回复内容: echo in_array('01',array('1'))
在使用in_array不采用strict时,为什么返回1,怎么判断的?
in_array($needle, $haystack) — 检查数组中是否存在某个值
你可以理解为依次取数组中的值,然后跟 $needle 做比较。如果 == 判断成立则返回 true.类似伪代码:
function in_array($needle, $haystack) { foreach($haystack as $val) { if ($val == $needle) { return true; } } return false;}
注意:在 php 中 == 同 === 的差别。
var_dump((01 == 1));var_dump(( 1 == 1));
然后你就明白了
补充一下:
就楼主问题来说, in_array 判断 字符串和数字是否相等时对输入的字符串 “01” 进行了取值。详细情况可以参见: php类型比较表 - php官方网站 php.net
'01' == '1'; 结果是 trueecho true 结果是 1再附一个《php 类型比较表》http://php.net/manual/zh/types.comparisons.php
in_array 源码定义在 https://github.com/php/php-src/blob/master/ext/standard/array.c
/* {{{ proto bool in_array(mixed needle, array haystack [, bool strict]) checks if the given value exists in the array */php_function(in_array){ php_search_array(internal_function_param_passthru, 0);}/* }}} */
继续搜索 php_search_array 的源码,当使用非严格模式时,调用 fast_equal_check_function 函数,借助 github 的搜索功能,快速定位到 zend/zend_operators.h 文件
static zend_always_inline int fast_equal_check_function(zval *result, zval *op1, zval *op2 tsrmls_dc){ if (expected(z_type_p(op1) == is_long)) { if (expected(z_type_p(op2) == is_long)) { return z_lval_p(op1) == z_lval_p(op2); } else if (expected(z_type_p(op2) == is_double)) { return ((double)z_lval_p(op1)) == z_dval_p(op2); } } else if (expected(z_type_p(op1) == is_double)) { if (expected(z_type_p(op2) == is_double)) { return z_dval_p(op1) == z_dval_p(op2); } else if (expected(z_type_p(op2) == is_long)) { return z_dval_p(op1) == ((double)z_lval_p(op2)); } } else if (expected(z_type_p(op1) == is_string)) { if (expected(z_type_p(op2) == is_string)) { if (z_str_p(op1) == z_str_p(op2)) { return 1; } else if (z_strval_p(op1)[0] > '9' || z_strval_p(op2)[0] > '9') { if (z_strlen_p(op1) != z_strlen_p(op2)) { return 0; } else { return memcmp(z_strval_p(op1), z_strval_p(op2), z_strlen_p(op1)) == 0; } } else { zendi_smart_strcmp(result, op1, op2); return z_lval_p(result) == 0; } } } compare_function(result, op1, op2 tsrmls_cc); return z_lval_p(result) == 0;}