【问题标题】:How to make array loop faster in PHP如何在 PHP 中使数组循环更快
【发布时间】:2021-08-31 03:04:27
【问题描述】:

有没有办法让它更快?

while ($item = current($data))
{
    echo '<ATTR>',$item, '</ATTR>', "\n";
    next($data);
}

我不喜欢我需要创建像 $item 这样的新变量。

【问题讨论】:

  • 实际上,您根本不需要 $item 声明。
  • 难道你不只需要在 while 中放入 $item = current($data) 而不是语句吗?
  • 我使用 microtime 检查了速度。似乎使用“while (current($data))” 比“while ($item = current($data))” 慢,但很少。使用 foreach 明显更快。
  • 虽然 foreach 更快,但它确实会创建变量。避免创建变量的整个尝试都是错误的(尽管在 PHP 世界中很常见)。在这里查看我对您问题的混音stackoverflow.com/questions/1156936/…
  • @yar,你链接到这个页面

标签: php


【解决方案1】:
<?php
$transport = array('foot', 'bike', 'car', 'plane');

foreach ($transport as $value) {
    echo $value;
}
?>

【讨论】:

    【解决方案2】:

    如果您不想创建临时变量,请这样做:

    while (current($data))
    {
        echo '<ATTR>',current($data), '</ATTR>', "\n";
        next($data);
    }
    

    但是,我不知道这是否真的会让它变得更快。他们唯一的判断方法是使用分析器,但这是一种微优化,我怀疑你会注意到差异。

    加快循环速度的最佳方法是使用速度更快的计算机。

    【讨论】:

    • 同意,如果循环足够大以产生明显的差异,那么服务器发送回响应所需的时间将使优化它节省的时间相形见绌。
    • 我使用 microtime() 检查速度,foreach 比 current() 和 next() 循环更快。
    • 是的,但是您说您不想创建这些临时变量 - 使用 foreach 循环您正在创建其中的 2 个!
    【解决方案3】:

    如果您所做的只是上面的代码,您可以使用 implode 语句。

    
    if (count($data) > 0) {
         echo "<ATTR>".implode("</ATTR>\n<ATTR>", $data)."</ATTR>";
    }
    

    【讨论】:

    • 你的意思是内爆("\n", $data);
    • 在处理时,可能会花费相同数量的(微)时间,因为它可能会执行 foreach 循环。
    • 谢谢,我检查了这个,它比我有的要快,但是使用 foreach 似乎要快一点。
    • 是的,我不确定它会快多少 - 对我来说似乎有点像微优化:P
    【解决方案4】:

    $nl = "\n";

    while ($item = current($data))
    {
        echo '<ATTR>',$item, '</ATTR>',$nl;
        next($data);
    }
    

    将换行符存储到变量中,而不是让 PHP 在每次迭代中解析双引号。

    【讨论】:

    • 亚历克斯。尝试使用 PHP_EOL 而不是将 \n 存储为变量。
    【解决方案5】:

    你可以做一个 foreach,但你会创建 2 个新变量。除非你只是不喜欢在 while() 子句中分配变量的想法。

    foreach($data as $key => $value)
    {
        echo $key . " => ".$value;
    }
    

    无论哪种方式,您都需要创建一个实际变量。

    【讨论】:

      【解决方案6】:

      这个呢:

      function my_func($str) {
          echo "<attr>{$str}</attr>\n";
      }
      array_map('my_func', $data);
      

      (应该可以,但我很好奇它与foreach 循环相比的速度)

      或者,如果您使用的是 PHP >= 5.3 (可能不是您的情况,顺便说一句),您可以使用这个,基于 lambda 函数:

      array_map(function ($item) {
          echo "<attr>{$item}</attr>\n";
      }, $data);
      

      几乎相同,但不必声明在程序中只使用一次的函数。

      【讨论】:

        【解决方案7】:

        我做了一个小板凳来梳理它。

        <?php
        
        $a = array();
        for ($i = 0; $i < 100000; $i++) {
            $a[] = $i;
        }
        
        $start = microtime(true);
        foreach ($a as $k => $v) {
            $a[$k] = $a[$k] + 1;
        }
        echo "foreach               : ", microtime(true) - $start, " Seconds\n";
        
        $start = microtime(true);
        foreach ($a as $k => &$v) {
            $v = $v + 1;
        }
        echo "foreach with cursor   : ", microtime(true) - $start, " Seconds\n";
        
        $start = microtime(true);
        for ($i = 0; $i < count($a); ++$i) {
            $a[$i] = $a[$i] + 1;
        }
        echo "for                   : ", microtime(true) - $start, " Seconds\n";
        
        $start = microtime(true);
        for ($i=0,$l=count($a);$i<$l;++$i) {
            $a[$i] = $a[$i] + 1;
        }
        echo "for with cached count : ", microtime(true) - $start, " Seconds\n";
        
        

        有结果

        foreach               : 0.0039410591125488 Seconds
        foreach with cursor   : 0.00357985496521 Seconds
        for                   : 0.0022602081298828 Seconds
        for with cached count : 0.0020480155944824 Seconds
        

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 1970-01-01
          相关资源
          最近更新 更多