PHP 的 in_array 真的遍历整个数组吗?
Does PHP's in_array really go through the whole array?
我无意中发现了一些文章(例如 this one)和建议 PHP 的 in_array()
贯穿整个数组的信息。
现在这里可能重复了这个问题: 但是 OP 显然对 C 语言函数定义的 copy/paste 感到满意,没有进一步描述...
然而我的问题是:
PHP的in_array()
真的遍历整个数组吗?
我试图看得更远,并追寻 ZEND_HASH_FOREACH_KEY_VAL
,但后来有点混乱:
- the C-language definition of
php_search_array()
... PHP 中的 in_arary()
- Codes of
ZEND_HASH_FOREACH_KEY_VAL
and ZEND_HASH_FOREAC
我唯一确定的是自从 ??迭代??发生在“C 级”它应该比“手动”快 foreach
...
Does PHP's in_array really go through the whole array?
TLDR; 不,不是。
我阅读C实现的方式:
- ZEND_HASH_FOREACH_KEY_VAL 或者 ZEND_HASH_FOREACH 使用指向当前元素的指针遍历数组数据桶。
- 每次迭代,元素指针都赋值给变量entry in void php_search_array。
- 找到匹配后,PHP 列表项本身或 PHP 布尔值由引擎根据 行为 return 编辑 给函数的参数。
回答你的问题:
php_search_array 调用 Zend RETURN_TRUE(实现:https://github.com/php/php-src/blob/master/Zend/zend_API.h)或设置 RET_VAL 并执行 C return;然后。在这两种情况下,如果找到匹配项,C 执行就会中断数组的迭代。
我无意中发现了一些文章(例如 this one)和建议 PHP 的 in_array()
贯穿整个数组的信息。
现在这里可能重复了这个问题:
然而我的问题是:
PHP的in_array()
真的遍历整个数组吗?
我试图看得更远,并追寻 ZEND_HASH_FOREACH_KEY_VAL
,但后来有点混乱:
- the C-language definition of
php_search_array()
... PHP 中的 - Codes of
ZEND_HASH_FOREACH_KEY_VAL
andZEND_HASH_FOREAC
in_arary()
我唯一确定的是自从 ??迭代??发生在“C 级”它应该比“手动”快 foreach
...
Does PHP's in_array really go through the whole array?
TLDR; 不,不是。
我阅读C实现的方式:
- ZEND_HASH_FOREACH_KEY_VAL 或者 ZEND_HASH_FOREACH 使用指向当前元素的指针遍历数组数据桶。
- 每次迭代,元素指针都赋值给变量entry in void php_search_array。
- 找到匹配后,PHP 列表项本身或 PHP 布尔值由引擎根据 行为 return 编辑 给函数的参数。
回答你的问题:
php_search_array 调用 Zend RETURN_TRUE(实现:https://github.com/php/php-src/blob/master/Zend/zend_API.h)或设置 RET_VAL 并执行 C return;然后。在这两种情况下,如果找到匹配项,C 执行就会中断数组的迭代。