繁体   English   中英

在循环条件下使用count($ arr)是否可以

[英]Is it ok to use count($arr) in loop conditions

我想知道哪种方式更好用,为什么?

    $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()的返回值。

第一:

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是调用计算数组中元素函数 ,不应该重复调用函数。 如果空间没有问题,那么你应该调用这个函数一次并存储返回值,然后在你想要的地方使用该变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM