gpt4 book ai didi

php数组指针奇怪

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:24 24 4
gpt4 key购买 nike

$a=array('a','b','c','d');

while(key($a)!==NULL){
echo key($a).'=>'.current($a).'<br/>';
next ($a);
}

prev($a);
var_dump(current($a));

为什么 var_dump 返回 false 而不是 "d"

最佳答案

这绝对是设计使然,尽管我梳理了 PHP 文档,但我找不到任何引用资料说明一旦您通过 next 结束时使指针无效array 你不能再使用 prev,PHP 源代码 ( zend_hash.c ) 清楚地表明发生了什么:

ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
{
HashPosition *current = pos ? pos : &ht->pInternalPointer;

IS_CONSISTENT(ht);

if (*current) {
*current = (*current)->pListNext;
return SUCCESS;
} else
return FAILURE;
}

ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)
{
HashPosition *current = pos ? pos : &ht->pInternalPointer;

IS_CONSISTENT(ht);

if (*current) {
*current = (*current)->pListLast;
return SUCCESS;
} else
return FAILURE;
}

如您所见,zend_hash_move_backwards_ex(在 PHP 中映射到 prev)在执行任何操作之前测试当前指针是否有效,并且 zend_hash_move_forward_ex 会将值设置为 pListNext,在最后一个元素的情况下将为 null

即与您可能期望的不同,nextprev 不只是盲目地递增或递减 C 指针然后检查结果以返回值或 NULL,它们实际上在递增之前检查指针或递减。

绝对是文档中的一个缺陷,当然需要记录下来。正如在另一个回复中提到的,您可以使用 end 在通过遍历列表使指针无效后转到最后一个元素。

但是,您应该能够通过在每个进程之前克隆指针然后在到达进程末尾后使用克隆的指针来实现您想要的逻辑(无需使用 end())大批。 (但如果您已经知道 prev() 在已迭代数组的向后导航方面被设计破坏,则没有真正充分的理由这样做)

(题外话:我很高兴看到受人尊敬的 PHP 使用 inconsistent function names 的传统即使在底层 C 代码中也依然存在:zend_hash_move_forward_ex vs zend_hash_move_backward *s*_ex.)

关于php数组指针奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10697137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com