[英]Why in_array doesn't work on array that was created using loop in PHP?
為什么in_array
不能在從循環php創建的數組上工作?
以下代碼顯示Match found
。
<?php
for ($i = 0; $i < 10; ++$i) {
$people[] = $i;
}
if (in_array('test', $people))
{
echo "Match found";
}
else
{
echo "Match not found";
}
?>
以下代碼顯示Match not found
。
<?php
$people = array("0","1","2","3","4","5","6","7","8","9");
if (in_array('test', $people))
{
echo "Match found";
}
else
{
echo "Match not found";
}
?>
如何解決第一個代碼顯示Match not found
因為在你的第一個數組中你有整數,默認情況下in_array()
會進行非嚴格類型比較 ,它只考慮了有限數量的類型對 。 所以它會用你的針做一個靜音強制轉換為整數,結果為0,它在數組中找到它。
要避免此錯誤,只需將TRUE
作為第3個參數傳遞給in_array()
以便進行嚴格的類型比較 ,例如
if (in_array('test', $people, TRUE))
你改變了
$people[] = $i; ---by--> $people[] = "$i";
然后你比較字符串
<?php
for ($i = 0; $i < 10; ++$i) {
$people[] = "$i";
}
if (in_array('test', $people))
{
echo "Match found";
}
else
{
echo "Match not found";
}
?>
你已經得到了答案,告訴你如何解決這個問題。 讓我加上一個更技術性的答案為什么會發生這種情況......
這種行為植根於ZEND_API int compare_function(..)
的特殊方式。
當你在沒有$ strict = true的情況下調用in_array(needle, haystack, strict)
,此函數用於 將 needle
與haystack中的每個元素進行比較 ,直到找到匹配為止。
你的針是一個字符串,大海撈針中的元素是整數。
讓我們看一下(n縮寫)看看compare_function()
while(1) {
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
case TYPE_PAIR(IS_LONG, IS_LONG):
ZVAL_LONG(result, Z_LVAL_P(op1)>Z_LVAL_P(op2)?1:(Z_LVAL_P(op1)<Z_LVAL_P(op2)?-1:0));
return SUCCESS;
[...more CASEs that don't apply on the first iteration of the while-loop...]
default:
[...some if-elseif cases that do not apply on the first iteration of the while-loop...]
} else {
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
converted = 1;
}
[...]
當這個代碼第一次被op1 ~ 'test'
和op2~0
激活時。 (〜意思是“大致是”,因為內部代表有點不同,但這里並不重要。)
但是沒有TYPE_PAIR(IS_STRING,IS_LONG)的情況,所以它命中默認值:branch。 處理對象有一些if條件,但操作數都不是一個對象,所以它轉到操作數被轉換的部分(一次)。
同樣沒有if-conditon適用,因此它命中最后一個將兩個操作數轉換為數字的else分支。
'test'
被轉換為0
和0
的住宿0
。
然后再次執行while循環,現在使用TYPE_PAIR(IS_LONG,IS_LONG) - 第一種情況。 現在兩個操作數相等 - > in_array()返回true。
......是的,我發現這也令人困惑;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.