我想知道哪种方式更好,为什么?
$arr = array(); // some array
for($i = 0; $i < count($arr); ++$i) {
//some code
}
或
$arr = array(); // some array
$cnt = count($arr);
for($i = 0; $i < $cnt; ++$i) {
//some code
}
感谢您的回答!
我认为您必须注意的最大区别是在第一个示例中修改数组。
举个例子:
第一:
<?php
$arr = [1,2,3];
for($i = 0; $i < count($arr); ++$i) {
//^^^^^^^^^^^ See here
echo "x". "<br />";
array_pop($arr);
}
?>
输出:
x
x
条件: $i < count($arr)
1. Iteration: 0 < 3 -> TRUE
2. Iteration: 1 < 2 -> TRUE
3. Iteration: 2 < 1 -> FALSE
第二:
<?php
$arr = [1,2,3];
$c = count($arr);
for($i = 0; $i < $c; ++$i) {
//^^ See here
echo "x". "<br />";
array_pop($arr);
}
?>
输出:
x
x
x
条件: $i < $c
1. Iteration: 0 < 3 -> TRUE
2. Iteration: 1 < 3 -> TRUE
3. Iteration: 2 < 3 -> TRUE
4. Iteration: 3 < 3 -> FALSE
因此,正如您在第一个示例中所看到的,循环比另一个循环少运行 1 次迭代!为什么?因为它在每次迭代中检查条件,所以当您现在在 for 循环中修改源数组时,每次迭代中的计数都会有所不同,而不是在第二个示例中,您在循环之前对数组进行计数,并且变量不会在 for 循环中更改。
除此之外,我认为你选择的东西更多的是个人喜好。(如果你想要最有效的一个,那就去第二个,你只给count()
打电话一次)
如果你想看看两个例子生成的操作码,那么最大的区别是,第二个比第一个不分配返回count()
的操作多做 1 次操作。
第一:
number of ops: 11
compiled vars: !0 = $arr, !1 = $i
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > INIT_ARRAY ~0
1 ASSIGN !0, ~0
4 2 ASSIGN !1, 0
3 > SEND_VAR !0
4 DO_FCALL 1 $3 'count'
5 IS_SMALLER ~4 !1, $3
6 > JMPZNZ 9 ~4, ->10
7 > PRE_INC !1
8 > JMP ->3
6 9 > > JMP ->7
10 > > RETURN 1
第二:
number of ops: 12
compiled vars: !0 = $arr, !1 = $cnt, !2 = $i
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > INIT_ARRAY ~0
1 ASSIGN !0, ~0
4 2 SEND_VAR !0
3 DO_FCALL 1 $2 'count'
4 ASSIGN !1, $2
5 5 ASSIGN !2, 0
6 > IS_SMALLER ~5 !2, !1
7 > JMPZNZ A ~5, ->11
8 > PRE_INC !2
9 > JMP ->6
7 10 > > JMP ->8
11 > > RETURN 1
如果不寻找最后一个毫秒运行时,则第一个示例是更典型的示例。但它确实会在每次迭代时再次检查数组的大小,因此速度稍慢。但是代码更好读。所以第一个是程序员书籍兼容的,而第二个已经优化了(可能还为时过早;)
count 是用来计算数组中元素数量的函数,你不应该重复调用一个函数。 如果空间不是问题,那么你应该调用这个函数一次并存储返回的值,然后在你想要的地方使用该变量。
- 了解计数