如何获取(通过引用)数组的长度

时间:2012-07-10 12:26:05

标签: php arrays

我正在从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

3 个答案:

答案 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。也许简单的SplHeapSplDoublyLinkedList可以满足您的要求。此外,表演还不错!