簡體   English   中英

為什么in_array不適用於在PHP中使用循環創建的數組?

[英]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'被轉換為00的住宿0
然后再次執行while循環,現在使用TYPE_PAIR(IS_LONG,IS_LONG) - 第一種情況。 現在兩個操作數相等 - > in_array()返回true。

......是的,我發現這也令人困惑;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM