我正在从mysql结果中循环几千行并将它们添加到不同的数组中。
我得到对数组中最后一个要操作的元素的引用(出于此问题范围之外的原因)。
即。 (只是场景的一个例子)
$myarray = array();
$result = &$myarray;
$row = &$result[count($result)-1]
当然这是有效的,但正如这个线程(Why is calling a function (such as strlen, count etc) on a referenced value so slow?)所解释的那样,通过引用调用一个不期望变量的函数,通过引用使用变量,使函数复制变量来运行上。
当我的$ result数组增长到数千个元素时,不断地对它进行调用count,导致它的副本生成,使得代码无法使用缓慢。
我如何解决这个问题 - 不建议不通过引用使用变量。 另外,我不能保持单独的行计数器。
基本上我需要知道如何取消引用by-reference变量(我理解不能这样做),或者其他一些获取数组长度的方法? ,或者获取对数组中最后一行的引用的方法(不弹出它)
请记住,数组也可以为空。
我已经花了很长时间才发现这是问题,所以我非常感谢你解决这个问题的任何帮助。
修改 对于那些说计数不可能比结束/关键慢的人: 只需运行这个简单的测试即可确认
//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
答案 0 :(得分: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()
都会通过引用获取其参数。但是,如果他们现在正在参考参考文献,我不会感到惊讶,但这是你可以调查的。
答案 1 :(得分:1)
取决于你提到的其他需求,但没有描述,也许一些真正的oldschool(深层次)功能可以帮助:
end($result); // set pointer to (current) last element
$pos = key($result); //index of the last element
$row = &$result($pos);
编辑:我打字太慢了:)
答案 2 :(得分:0)
您应该查看SPL data structures。也许简单的SplHeap或SplDoublyLinkedList可以满足您的要求。此外,表演还不错!