4

我从 mysql 结果中循环了数千行并将它们添加到不同的数组中。

我得到了对数组中要操作的最后一个元素的引用(出于此问题范围之外的原因)。

即(只是场景的一个例子)

$myarray = array();
$result = &$myarray;
$row = &$result[count($result)-1]

当然这是可行的,但是正如这个线程(为什么在引用的值上调用函数(如strlen,count等)这么慢?)解释说,调用一个不期望引用变量的函数,使用引用变量,导致函数复制要操作的变量。

随着我的 $result 数组增长到数千个元素,不断地调用它,导致复制它,使代码无法使用缓慢。

我怎样才能解决这个问题 - 不建议不要通过引用使用变量。另外,我不能保留单独的行计数器。

基本上我需要知道如何取消引用引用变量(我理解不能这样做),或者其他方式来获取数组长度?,或获取对数组中最后一行的引用的方法(不弹出它)

请记住,数组也可能为空。

我已经花了很长时间才发现这是问题所在,所以我非常感谢任何解决问题的帮助。

编辑 对于每个说 count 不可能比 end/key 慢的人:只需运行这个简单的测试来确认

//setup array of 10 000 elements
$ar = array();
for ($i = 0 ; $i < 10000 ; $i++)
{
    $ar[] = $i;
}
//get a reference to it
$ref = &$ar;
error_log (date("Y/m/d H:i:s")." : speed test 1 \r\n",3,"debug.log");
//do 10 000 counts on the referenced array
for ($i = 0 ; $i < 10000 ; $i++)
{
    $size = count($ref);
}
error_log (date("Y/m/d H:i:s")." : speed test 2 \r\n",3,"debug.log");
//do 10 000 end/key on the referenced array
for ($i = 0 ; $i < 10000 ; $i++)
{
    reset($ref);
    end($ref);
    $size = key($ref);
}
error_log (date("Y/m/d H:i:s")." : end \r\n",3,"debug.log");

输出:计数需要 15 秒...结束/键不到一秒

2012/07/10 17:25:38 : speed test 1
2012/07/10 17:25:53 : speed test 2
2012/07/10 17:25:53 : end
4

3 回答 3

3

我仍然不确定我是否理解为什么这是必要的。但是,您已将数组索引为数字顺序数组,因此您可以执行此“技巧”来获取大小:

// Make sure the array pointer is at the end of the array
end($result); // Not sure if this is necessary based on your description
$size = key($result) + 1; // Get the numeric key of the last array element

请注意,两者都end()通过key()引用获取它们的参数。但是,如果他们现在对引用的引用进行操作,我不会感到惊讶,但这是您可以调查的。

于 2012-07-10T12:38:33.083 回答
1

根据您提到但未描述的其他需求,也许一些真正的老派(深层)功能可以提供帮助:

end($result); // set pointer to (current) last element
$pos = key($result); //index of the last element
$row = &$result($pos);  

编辑:我打字太慢了:)

于 2012-07-10T12:39:36.057 回答
0

您应该看看SPL 数据结构。也许一个简单的SplHeapSplDoublyLinkedList 可以满足您的要求。而且,表演还不错!

于 2012-07-10T12:39:55.543 回答