在这种情况下,清除数组的哪种方法更好?

时间:2018-08-17 03:20:47

标签: php arrays

我打算通过循环创建多维数组。我的想法是,在循环函数内部,我将元素分配到单个数组中,然后在我为下一个循环过程清空单个数组之前,将单个数组分配到另一个大数组中。

例如

array (size=2)
  0 => 
    array (size=2)
      'a' => int 0
      'b' => int 2
  1 => 
    array (size=2)
      'a' => int 3
      'b' => int 5

结果将是:

unset

但是我发现实际上有很多方法可以清空数组,而我不确定我清空数组的方式是否比$arr1 = array()等其他方式更好/更有效。在这种情况下,像unset($arr) $arr = array() $arr = [] 这样重新初始化该数组。我在网上浏览,但在比较这些方式方面并没有太多。有什么建议可以改善这种性能,还是与其他方法一样好?通过查看这些内容:

[2018-08-14 17:48:20.849][http-nio-8888-exec-4] DEBUG o.s.j.d.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [HikariProxyConnection@1121924585 wrapping com.mysql.jdbc.JDBC4Connection@41813449]

也许还有其他方式?

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作,而不是制作一个额外的数组(较小的数组),然后将值分配给较大的数组:

for($i=0;$i<5;$i++){
      $arr2[$i]['a'] = $i;
      $arr2[$i]['b'] = $i+2;
    }
var_dump($arr2);

输出:

array (size=2)
  0 => 
    array (size=2)
      'a' => int 0
      'b' => int 2
  1 => 
    array (size=2)
      'a' => int 3
      'b' => int 5

在这种情况下,您不需要一次又一次清空(较小的)数组。而且,由于只使用一个数组,它可以节省您的内存空间。

答案 1 :(得分:1)

如果要执行比较,可以在此代码的帮助下完成。

参考:https://gist.github.com/blongden/2352583

它看起来像这样:

<?php

$calibration = benchmark(function() {

    for($i=0;$i<5;$i++){
          $arr2[$i]['a'] = $i;
          $arr2[$i]['b'] = $i+2;
        }

});

$benchmark = benchmark(function(){

    for($i=0;$i<5;$i++){
       $arr1['a'] = $i;
       $arr1['b'] = $i+=2;
       $arr2[] = $arr1;
       $arr1 = [];
    }

});

echo "Calibration run: ".number_format($calibration)."/sec\n";
echo "Benchmark run: ".number_format($benchmark)."/sec\n";
echo 'Approximate code execution time (seconds): '.number_format((1/$benchmark) - (1/$calibration), 10);

function benchmark($x)
{
    $start = $t = microtime(true);
    $total = $c = $loop = 0;
    while (true) {
        $x();
        $c++;
        $now = microtime(true);
        if ($now - $t > 1) {
            $loop++;
            $total += $c;
            list($t, $c) = array(microtime(true), 0);
        }
        if ($now - $start > 2) {
            return round($total / $loop);
        }
    }
}

在我的环境中运行测试的输出(PHP 7.2.8-1 + ubuntu16.04.1 + deb.sury.org + 1)

Calibration run: 258,534/sec
Benchmark run: 259,401/sec
Approximate code execution time (seconds): -0.0000000129

您会发现Nikhil的给定功能实际上更快。

正在运行的以下功能的输出:

for($i=0;$i<5;$i++){
      $arr2[$i]['a'] = $i;
      $arr2[$i]['b'] = $i+2;
    }

Calibration run: 209,614/sec
Benchmark run: 209,773/sec
Approximate code execution time (seconds): -0.0000000036

随时进行自己的测试