gpt4 book ai didi

php - 为什么我在 PHP 中遇到段错误?

转载 作者:行者123 更新时间:2023-12-04 11:33:19 25 4
gpt4 key购买 nike

在今天之前,我从未在 PHP 中看到过 SegFault,但显然这是可能的。起初我以为是 mysql 驱动程序,但结果是我的代码;)。

我花了大约 2 天的时间调试我的代码,并最终找到了它的原因(所以对于所有遇到这个问题的 future PHP 程序员,不客气!)

长话短说,你 不能做 unset()在您正在行走的同一阵列上array_walk() .

目的是消除 $this->votes 中不存在于 $out 数组中的所有元素(其中 $this->votes 的键与 $out 中元素之一的 id 属性匹配)。

问题 我有大约一半的时间代码可以正常运行,另一半它会因 apache 日志中的段错误而崩溃(这使得调试变得非常困难,因为我注意到这个错误已经有一段时间了)。

是的,这是一段经过深思熟虑的代码开始......

    array_walk($this->votes, function(&$o, $key) use($that, $out) {
$found = array_filter($out, function($p) use($key) {
return $p['id'] == $key;
});

if(count($found) == 0) {
unset($this->votes[$key]); //very very bad!!!!
}
});

最佳答案

据我了解,最终发生的是 unset()搞砸了$this->vote s 数组长度。 array_walk使用期望 $this->votes 的迭代器阵列在整个步行过程中保持相同的长度。如果我自己写 array_walk函数( for ($i = 0; $i < count($this->votes); $i++ )它只会抛出一个 undefined index 通知。但由于我们使用的是 array_walk它实际上会尝试在内存中查找可能有也可能没有数据的位置。这会导致函数的不可预测性(有时代码可以运行得很好,有时会导致段错误)。

所以正确的做法是

    $tmpVotes = array();
array_walk($this->votes, function(&$o, $key) use($that, $out, $tmpVotes) {
$found = array_filter($out, function($p) use($key, $that, $tmpVotes) {
return $p['id'] == $key;
});

if(count($found) > 0) {
$tpmVotes[$key] = $o;
}
});

$this->votes = $tmpVotes;

来自 PHP 手册:

Only the values of the array may potentially be changed; its structure cannot be altered, i.e., the programmer cannot add, unset or reorder elements. If the callback does not respect this requirement, the behavior of this function is undefined, and unpredictable.



如果有人有更好的方法来解释这里发生的事情,请发帖!

关于php - 为什么我在 PHP 中遇到段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761109/

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