通过引用传递的PHP数组?

PHP array passed by reference?

提问人:Braulio J. Solano 提问时间:4/26/2015 更新时间:5/4/2015 访问量:114

问:

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

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

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

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

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

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

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

最佳,

B.

PHP 数组 Typo3 Pass-by-Reference Pass-By-Value

评论

1赞 Rohit Gupta 4/26/2015
这里已经回答了 stackoverflow.com/questions/2030906/......
0赞 Braulio J. Solano 4/26/2015
罗希特非常感谢您的回答。我想然后我在 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); ?>
0赞 Michael 5/2/2015
你在哪里检查外面的阵列?该方法仅用于将单词插入到单独的表中,然后从索引表中引用该表。由于参数不是通过引用传递的,因此没有机会进行您所说的修改。我无法重现您描述的问题。checkWordList
0赞 Braulio J. Solano 5/4/2015
@Michael,我会发布一个答案。对不起。那是在晚上。我累了,我正在用眼睛检查调试信息。我其实发现了问题,会在答案中描述一下。最好的。;-)

答:

0赞 Braulio J. Solano 5/4/2015 #1

数组确实是按值传递的(或者正如一些人所指出的那样,如果它们没有在函数或方法中被修改,请参阅上面的 Rohit 注释)。

我以为数组是不同的,但事实并非如此。这只是疲劳。在深夜进行调试效率不高。

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

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

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