PHP的in_array真的可以通过整个数组吗?

时间:2017-04-15 22:28:54

标签: php arrays zend-framework contain

我偶然发现了一些文章(例如this one)以及建议PHP in_array()遍历整个数组的信息。

现在这个问题可能有重复:How does PHP's in_array function work?但是OP显然对C语言函数定义的复制/粘贴感到满意,没有进一步的描述......

我的问题是:

PHP' in_array() 真的是否通过整个数组?

我试图进一步观察并追踪ZEND_HASH_FOREACH_KEY_VAL,但后来有点混乱:

我唯一确定的是,自迭代以来?发生在" C级"它应该比"手动"更快foreach ...

1 个答案:

答案 0 :(得分:1)

  

PHP的in_array真的可以通过整个数组吗?

TLDR; 不,不。

我阅读C实现的方式:

  1. ZEND_HASH_FOREACH_KEY_VAL或者更确切地说ZEND_HASH_FOREACH使用指向当前元素的指针遍历数组数据桶。
  2. 每次迭代时,元素指针都会分配给 void php_search_array 中的变量条目
  3. 找到匹配项时,引擎会返回PHP列表项本身或PHP bool,具体取决于为该函数提供的行为参数。
  4. 回答你的问题:

    php_search_array要么调用Zend RETURN_TRUE (impl:https://github.com/php/php-src/blob/master/Zend/zend_API.h),要么设置 RET_VAL 并执行C返回;然后。在这两种情况下,如果找到匹配项,C执行就会突破数组的迭代。