我打算通过循环创建多维数组。我的想法是,在循环函数内部,我将元素分配到单个数组中,然后在我为下一个循环过程清空单个数组之前,将单个数组分配到另一个大数组中。
例如
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]
也许还有其他方式?
答案 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
随时进行自己的测试