提问人:Braulio J. Solano 提问时间:4/26/2015 更新时间:5/4/2015 访问量:114
通过引用传递的PHP数组?
PHP array passed by reference?
问:
我一直在寻找这个问题的答案,我有一个数组,但到目前为止,这里和网络都没有答案。
我们有一个 TYPO3 网站,它配置并安装了索引搜索。我们使用爬虫扩展来抓取记录 (~60000)。一切都已配置并运行良好,但我们看到一些记录没有出现在搜索结果中。
我调试了 TYPO3 代码,发现有些单词与其在index_rel表中的记录无关。
我发现,当运行代码在第 573 行输入方法 indexTypo3PageContent() 时,会调用方法 checkWordList(),并将单词数组作为参数传递。在方法内部,有一些数组值的未设置。这是出错的地方,因为如果我是对的,数组是按值传递的,但是 checkWordList() 方法之外的数组发生了变化,字数更少。因此,某些单词不会反向索引到其记录。
我可以更改代码。这很容易。但是,我想了解问题所在。是PHP错误吗?PHP数组不是按值传递的吗?我在 Ubuntu 上使用 PHP 5.5。
如果有人能给出正在发生的事情的提示,我将不胜感激。
无论如何,我在 TYPO3 错误系统上发布了一个错误。
最佳,
B.
答:
数组确实是按值传递的(或者正如一些人所指出的那样,如果它们没有在函数或方法中被修改,请参阅上面的 Rohit 注释)。
我以为数组是不同的,但事实并非如此。这只是疲劳。在深夜进行调试效率不高。
无论如何,我在深入研究代码后发现了问题。我正在使用 indexed_search 的 TYPO3 4 LTS 版本。
索引器的 indexAnalyze 方法调用另外两个方法:analyzeHeaderInfo 和 analyzeBody。这两种方法几乎相同,只是 analyzeHeaderInfo 没有设置 first(第一次出现),它实际上是一个数组索引。然后在 submitWords 方法中,当首先使用 unset 进行查询时,MySQL 会抱怨首先为 NULL。因此,不进行插入。由于代码清理,这在较新版本上不会发生。正如在提供的代码链接中看到的那样,有一个类型被转换为 int,因此如果未设置 first,它将为零而不是 null。人们仍然可以讨论每个元数据的语义,其首发次数等于零,但那是另一回事了。
希望这可以帮助使用和旧indexed_search TYPO3 的人。;-)
评论
<?php error_reporting(E_ALL); ini_set('display_errors', 1); function x($array) { unset($array['a']); } $a = ['a'=>'5']; x($a); print_r($a); ?>
checkWordList