通过数字键或关联键更好地访问数组


Accessing array better via numeric or associative key?

我遍历数组数组,并通过关联键访问数组的值,这是一个代码片段。注意:我从不迭代总数组,只使用10的窗口。

//extract array from a db table (not real code)
$array = $query->executeAndFetchAssociative;
$window_start = 0;
for($i = $window_start; $i<count($array) && $i<$window_start+10; $i++)
  echo($entry["db_field"]);

这是一种用于web界面的分页器。我收到windows_start值并显示接下来的10个值。

概念执行:

  1. 接收windows_start编号
  2. 开始进入外部数组的window_Start-TH数组的循环
  3. 通过关联索引显示内部数组的字段值
  4. 移动到window_start+1

内部阵列具有大约40个场。外部数组在重新发送数据库表时可能会增长很多。现在我看到,随着外部数组越来越大,在10的窗口上执行需要越来越多的时间。

我需要一些关于我的代码的"性能理论":

如果我通过数字键输入内部数组的值,我能有更好的性能吗?通常,使用数字索引访问数组值是否比使用关联索引(字符串)访问更快?

输入长度为N的数组的随机项($array[random_num])的成本是多少?O(N)、O(N/2)只是例如

最后,在数组上迭代的速度取决于数组的长度?我的意思是,我总是在数组的10个元素上迭代,但数组长度对我的固定长度迭代有什么影响?

谢谢Alberto

如果我通过数字键输入内部数组的值,我可以性能更好?通常是更快地访问数组值使用数字索引而不是使用关联索引(字符串)访问?

基于整数的访问与基于字符串的访问可能存在理论上的速度差异(这取决于整数值的哈希函数与字符串值的哈希函数的作用,我还没有阅读PHP源代码来获得确切的答案),但这肯定是可以忽略不计的。

输入一个长度为N的数组?O(N)、O(N/2)只是例如

PHP中的数组是通过哈希表实现的,这意味着插入是摊销的O(1)——几乎所有的插入都是O(1,但也有少数可能是O(n)。顺便说一下,O(n)和O(n/2)是一回事;你可能想重新阅读一篇关于算法复杂性的文章。

最后,在数组上迭代的速度取决于数组长我的意思是,我总是迭代数组的10个元素,但如何数组长度会影响我的固定长度迭代吗?

不,数组长度不是一个因素。

性能下降并不是因为您访问阵列的方式,而是因为您似乎正在从数据库中加载所有记录,只是为了处理其中的10条。

您应该通过在SQL查询中包含偏移量和限制来将分页逻辑移动到数据库本身。

过早的优化是万恶之源。附加的数字数组和关联数组具有非常不同的语义,因此通常是不可互换的。最后但同样重要的是:不。PHP中的数组被实现为Hashmaps,通过密钥访问它们总是O(1)

在您的情况下(分页),只获取要显示的项目要有用得多,而不是稍后获取所有项目并对其进行切片。SQL具有LIMIT 10 OFFSET 20-语法。