【问题标题】:PHP array passed by reference?PHP数组通过引用传递?
【发布时间】:2015-07-04 11:58:18
【问题描述】:

我一直在寻找这个问题的答案,我有一个数组,但到目前为止,这里和网络都没有答案。

我们有一个配置并安装了索引搜索的 TYPO3 网站。我们使用爬虫扩展来爬取记录(~60000)。一切都已配置并运行良好,但我们看到搜索结果中没有出现一些记录。

调试TYPO3代码,发现index_rel表中有些词与其记录无关。

我发现,当运行代码在第 573 行进入方法 indexTypo3PageContent() 时,将调用方法 checkWordList(),并将单词数组作为参数传递。在该方法内部,有一些数组值未设置。这是错误的地方,因为如果我是对的,数组是按值传递的,但是方法 checkWordList() 之外的数组被更改,单词更少。因此有些词不会被反向索引到它的记录中。

我可以更改代码。这很容易。但是我想了解这个问题。它是一个PHP错误吗? PHP数组不是按值传递的吗?我在 Ubuntu 上使用 PHP 5.5。

如果有人能提示正在发生的事情,我将不胜感激。

无论如何,我在 TYPO3 错误系统上发布了一个错误。

最佳,

乙。

【问题讨论】:

  • Rohit 非常感谢您的回答。我想我在 PHP 中发现了一个错误,因为根据该页面上的答案,当在函数内部修改数组时,数组是按值传递的。但是,当 PHP 解析我在问题中指出的文件时,一定会发生一些事情。也许是因为未设置在控制结构内部。我在发布之前尝试了这样的代码:<?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 方法仅用于将单词插入单独的表中,然后从索引表中引用该表。由于参数不是通过引用传递的,因此没有机会进行您所说的修改。我无法重现您描述的问题。
  • @Michael,我会发布一个答案。我很抱歉。那是在晚上。我累了,我正在用眼睛检查调试信息。我实际上发现了问题,将在答案中描述它。最好的。 ;-)

标签: php arrays typo3 pass-by-reference pass-by-value


【解决方案1】:

数组确实是按值传递的(或者如果它们没有在函数或方法中修改,或者像某些人通过引用指出的那样,请参阅上面的 Rohit 评论)。

我认为数组不同,但事实并非如此。这只是疲劳。在很晚的时候调试是没有效率的。

无论如何,我在深入研究代码后发现了问题。我使用的是 TYPO3 4 LTS 版本的 indexed_search。

索引器的方法indexAnalyze调用了另外两个方法:analyzeHeaderInfo和analyzeBody。两种方法几乎相同,只是analyzeHeaderInfo 没有首先设置(第一次出现),这实际上是一个数组索引。然后在方法submitWords 中,当使用未设置的第一个进行查询时,MySQL 抱怨第一个为NULL。因此不进行插入。由于代码清理,这不会在较新版本上发生。正如您在提供的代码链接中看到的那样,有一个类型转换为 int,因此如果 first 未设置,它将为零而不是 null。人们仍然可以讨论第一次出现为零的每个元数据的语义,但这是另一回事。

希望这可以帮助使用 TYPO3 的旧 indexed_search 的人。 ;-)

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 2012-05-16
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多