在PHP中迭代数组的最快方法

24

我正在准备Zend PHP认证考试

我不确定如何回答这个问题。

问题:使用PHP 5迭代和修改数组的每个元素的最佳方法是什么?

a) 在迭代期间不能修改数组

b) for($i = 0; $i < count($array); $i++) { /* ... */ }

c) foreach($array as $key => &$val) { /* ... */ }

d) foreach($array as $key => $val) { /* ... */ }

e) while(list($key, $val) = each($array)) { /* ... */ }


我的直觉是(B),因为没有必要创建临时变量,但是我意识到它对于关联数组不起作用。

进一步在互联网上搜索,我发现:

将不变的数组计数存储在单独的变量中可以提高性能。

$cnt = count($array);
for ($i = 0; $i < $cnt; $i++) { }
3个回答

22

从这些选项中,C将是显而易见的答案。

剩下的选项(除了A)可能用于实现目标,取决于括号中的代码,但问题并没有显示该代码。因此,答案应该是C。

而你回答的是错误的问题——是的,在for循环之前使用count()会提高性能,但这个问题不是关于性能的。


“使用 PHP 5” 部分也可能是一个提示。b)、d)、e) 在 php4 中也是可能的,但 c) 不行。诚然,这只是弱证据,但考试题经常是这样的;-) 由于访问 b、d、e 元素需要另一个表查找,因此显然 c) 是“最好”的方法(在给定的选择中)。手册还指出,这在 foreach(array(1,2,3) as &$v) 中不起作用,可遍历必须是一个变量。 - VolkerK

10

您可以使用任何一种构造来迭代和修改数组的每个元素。但是有些注意事项:

b) 仅在数组是数字数组且键从0到n-1时才有用。

c) 对于两种类型的数组都有用。此外,$value是元素值的引用。因此,在foreach内部更改$value也会更改原始值。

d) 类似于c),除了$value是值的副本(请注意,foreach操作的是$array的副本)。但是,通过元素的键,您可以使用$array[$key]访问并更改原始值。

e) 类似于d)。 使用$array[$key]访问和更改原始元素。


2

SPL 是最好的答案。


1
SPL不能解决这个问题。即使它作为答案可用,我们也在谈论循环,而不是被循环的可遍历对象。 - Kevin Peno
2
SPL是“标准PHP库”。你能在回答中详细说明吗?这如何回答问题? - Peter Mortensen
2
我同意Peter的观点。在Stack Overflow的“早期”,仅提供链接提示而不尝试演示实现的情况非常普遍。我认为它们都应该被转移到问题下的评论中。 - mickmackusa

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