在具体PHP编码过程中,总会出现一些我们认为不可能的情况,如下几例:
in_array(0, ['a', 'b', 'c']) // 返回bool(true),也就相当于数组中有0 array_search(0, ['a', 'b', 'c']) // 返回int(0),也就是第一个值的下标 0 == 'abc' // 返回bool(true),也就相当于相等
这两个表达式都返回true
。
直观上看,0
没有在数组['a', 'b', 'c']
中,也不会等于abc
这个字符串。
那怎么会返回true
呢?
1 类型转换
原因就在于,在比较前,PHP做了类型转换。
PHP官网上关于“String conversion to numbers”的说明:http://php.net/manual/en/language.types.string.php#language.types.string.conversion
string
类型的数据会转换成int
型,然后再比较。
而如果string
类型数据第一个字符不是数字,就会转换成0
。例如,
echo intval("Bye"); // 输出0
in_array()
和array_search()
默认都是松散比较,相当于==
,所以就得到true
。
2 严格比较
那如何得到false
呢?
用严格比较,如下,
in_array(0, ['a', 'b', 'c'], true) // 返回false array_search(0, ['a', 'b', 'c'], true) // 返回false 0 === 'abc' // 返回false
强制做类型比较,这样就能拿到精确的结果。
3 false和null
那么,如果用false
和null
与字符串数组比较会如何呢?
它们是不会转换成int
型的,所以结果是这样的:
in_array(null, ['a', 'b', 'c']) //返回false in_array(false, ['a', 'b', 'c']) //返回false
4 数组中有true
另外一个看起来比较奇怪的现象:
in_array('a', [true, 'b', 'c']) // 返回bool(true),相当于数组里面有字符'a' array_search('a', [true, 'b', 'c']) // 返回int(0),相当于找到了字符'a'
这是为什么呢?
说起来也很好理解,松散比较下,任何string
都等于true
。
要想不相等,用严格比较。
相关推荐
当`type`参数设置为`true`时,`in_array()`会进行全等比较,不仅比较值,还比较类型。例如: ```php $str = '1'; $arr = array(1,3,5,7,9); $boolvalue = in_array($str, $arr, true); var_dump($boolvalue); ...
在这个例子中,`in_array($arr_b, $arr_a)`会检查数组`$arr_b`是否存在于数组`$arr_a`中,结果会输出"数组$arr_b在$arr_a数组中存在"。 通过这些例子,我们可以看到in_array()函数在不同情况下的用法和它的灵活性。...
$a = array("a" => "Dog", "b" => "Cat", "c" => 5, "d" => "5"); echo array_search("Dog", $a); echo array_search("5", $a); ``` 第一行代码会输出 "a",因为 "Dog" 是值 "Dog" 在数组中的键名。第二行代码会...
$arr_a = array(0 => "a", 1 => "b", 2 => "c"); $key = array_search("a", $arr_a); if ($key !== FALSE) { echo "键名为:$key"; } else { echo '无匹配结果'; } ?> ``` 在这个例子中,我们创建了一个包含三个...
3.17 为什么下面的代码总是给出0?double degC, degF; degC= 5.0 / 9 * (degF - 32); 40 3.18 需要根据条件把一个复杂的表达式赋给两个变量中的一个。可以用下面这样的代码吗?((condition) ? a : b)= ...
当尝试使用 `$.inArray({"a":"0"}, testarr)` 来查找 `{ "a": "0" }` 是否存在于数组中时,返回值为 `-1`。这是因为 `$.inArray()` 函数比较的是对象的引用而不是它们的值。即使两个对象具有相同的属性和值,只要...
$a = array("a" => "Dog", "b" => "Cat", "c" => "Horse"); echo array_search("Dog", $a); // 输出:a ?> ``` 在上述代码中,我们创建了一个关联数组 `$a`,并使用 `array_search()` 函数搜索值 "Dog"。由于 "Dog...
$a = array("a" => "5", "b" => 5, "c" => "5"); echo array_search(5, $a, true); // 输出:b ``` 在这个例子中,我们设置了 `strict` 参数为 `true`,所以函数会根据值和类型进行匹配。尽管字符串 "5" 和整数 5 ...
while lcm mod b>0 do inc(lcm,a); end; 该函数使用最小公倍数公式来计算两个整数的最小公倍数。 3.素数的求法 A. 小范围内判断一个数是否为质数 函数prime(n:integer):Boolean; var I:integer; begin for ...
$sweet = array('a' => 'apple', 'b' => 'banana'); $fruits = array('sweet' => $sweet, 'sour' => 'lemon'); function test_print($item, $key) { echo "$key holds $item "; } array_walk_recursive...
$a = array("a" => "Horse", "b" => "Cat", "c" => "Dog"); print_r(array_keys($a)); ``` 输出: ``` Array ( [0] => a [1] => b [2] => c ) ``` 在这个例子中,`array_keys()` 返回了一个包含原数组 `$a` 所有...
$a = array("a" => "Horse", "b" => "Cat", "c" => "Dog"); print_r(array_values($a)); ``` 上面的代码将输出: ``` Array ( [0] => Horse [1] => Cat [2] => Dog ) ``` `array_keys()` 函数则用于获取数组的...
while lcm mod b > 0 do inc(lcm, a); end; 3. 素数的求法 A. 小范围内判断一个数是否为质数: 函数 prime(n: integer): Boolean; var i: integer; begin for i := 2 to trunc(sqrt(n)) do if n mod i = 0 ...
- 示例:`$vars = compact('a', 'b', 'c');` #### 四、栈操作 1. **array_push(1.目标数组2.压入栈的值)** - 功能:将一个或多个元素压入数组的末尾。 - 示例:`array_push($arr, 'orange');` 2. **array_pop...
//设置指定位置为0或1,true表示1,false表示0,如果pos大于数组长度,则自动扩展 void set(size_t _Pos, bool _Val = true); //将位数组转换成整数,最低位放在[0]位置 //例如数组中存放的1011,则返回13,而...
例如,A And B 将返回 True,只有当 A 和 B 都为 True 时。 Array 函数:返回含一数组的变体。 Array 函数是一个数组函数,用于返回一个数组变体。例如,Array(1,2,3) 将返回一个数组,包含三个元素:1、2 和 3。 ...