将PHP数组作为引用传递给函数

6
我有一个问题找不到答案。
我正在构建一个非常大的数组,其中包含文件的十六进制值(例如$array[0]=B5 $array[1]=82等直到$array[1230009])。
当我创建一个函数来操作该数组中的某些偏移量并将$array作为引用传递(function parse(&$array) { ... }),它比正常传递数组(function parse($array) { ... })要慢得多。
这怎么可能呢?
PS:是否有任何更快的方法可以不使用数组?只需使用$ string =“B5 82 00 1E ..等”,但是我需要在读取十六进制值时跟踪Offset,因为其中一些值包含长度。

1
传递数组需要更长的时间,还是对传递的数组执行函数需要更长的时间?此外,这不是一种有效引用文件每个字节的RAM方式。我认为你应该使用字符串。 - crush
将数组作为引用传递执行该函数大约需要30秒,而通过普通传递方式执行则只需要2秒。 - pufos
1个回答

3
以下文章中有一些信息可能会对您有所帮助:不要使用PHP引用
在该文章接近结尾的地方,Johannes发布了以下代码部分(引用):
function foo(&$data) {
    for ($i = 0; $i < strlen($data); $i++) {
        do_something($data{$i});
    }
}

$string = "... looooong string with lots of data .....";
foo(string);

以下是相关翻译内容:

但在这种情况下,开发人员试图聪明地节省时间,通过传递一个引用来实现。但是,strlen()期望传入的是一份拷贝(而不是引用)。由于引用无法进行写时复制,因此在调用strlen()时,$data将被复制,strlen()将执行一个非常简单的操作,实际上strlen()是PHP中最简单的函数之一,并且该副本将立即被销毁。

考虑到您提出的问题,您可能会遇到类似的情况...


我现在明白了,但是如何使用字符串,比如 $string = "B5 82 00 1E .... 等等"?但我需要对每个十六进制值执行登录,并且在读取它时需要保持偏移量。 - pufos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接