【问题标题】:multidimensional array using $array[]使用 $array[] 的多维数组
【发布时间】:2013-09-02 14:37:26
【问题描述】:

阅读php manual on array push 时,我发现它建议使用 $array[]=$push 输入新条目。

所以我的问题是如何以最有效的方式(即速度)将它与多维数组一起使用。

示例 1:

 $client[] = (0);
 $client[] = (1);
 $client[] = (2);
 $client[] = (3);
 $array[$i++]=$client;
 unset($client);

示例 2:

$array[$i++]= array(0,1,2,3);

示例 3: 注意:我目前不知道在此设置数组键的好方法

$entry = array(0,1,2,3);
array_push($array,$entry);

嵌套在数组中的 4 个值会非常频繁地更新。为此,我假设使用以下方法将是我在速度和效率方面的最佳选择。

 $array[0][0]= $array[1][0]+1;

说明:我有个别客户具有唯一标识符。我需要为每个客户跟踪 4 个整数。我正在寻找最快/使用最低资源的方法。

总而言之,我不接受任何建议,但我很好奇示例 1 在速度和资源方面是否比示例 2 更好。

谢谢, JT

要测试的实际代码:

<?php
$array = array();

$i=0;
$t1 = microtime(true);
while ($i<10000){
$array[$i++]= array(0,1,2,3);
}
$time1 = microtime(true) - $t1;
$mem1 = memory_get_peak_usage(true);

//print_r($array);
$array = array();
//echo '<br><br>';

$i=0;
$t2 = microtime(true);
while ($i<10000){
$client[] = (0);
$client[] = (1);
$client[] = (2);
$client[] = (3);
$array[$i++]=$client;
unset($client);
}
$time2 = microtime(true) - $t2;
$mem2 = memory_get_peak_usage(true);

//print_r($array);
$array = array();
//echo ' <br><br>';

$i=0;
$t3 = microtime(true);
while ($i++<10000){
$entry = array(0,1,2,3);
array_push($array,$entry);
}
$time3 = microtime(true) - $t3;
$mem3 = memory_get_peak_usage(true);

//print_r($array);
//echo '<br><br>';

print 'example 1 - ' . $time1 . ' - ' . $mem1 . '<br/>';
print 'example 2 - ' . $time2 . ' - ' . $mem2 . '<br/>';
print 'example 3 - ' . $time3 . ' - ' . $mem3 . '<br/>';
?>

结果:

示例 2 - 0.212869294 S

示例 1 - 0.251849988 S

示例 3 - 0.748561144 S

所以数组推送是不行的! 这是大约 15 次运行的平均值,每个循环计数为 100*1000 :)

【问题讨论】:

  • 例1没有使用$array[1],所以结果不同。您能否发布两个示例的完整代码,以明确您想要比较的内容?
  • 是的,给我几分钟。 @DmitriZaitsev
  • @DmitriZaitsev 代码已编写
  • 就我而言,最快的是array_push。
  • @KeluThatsall 添加您尝试过的答案

标签: php arrays ubuntu multidimensional-array


【解决方案1】:

这是一个快速的肮脏测试

<?php
$t1 = microtime(true);

$array = array();

for ($i = 0; $i < 100000; $i++) {
  $client[] = (0);
  $client[] = (1);
  $client[] = (2);
  $client[] = (3);
  $array[]=$client;
  unset($client);
}

$time1 = microtime(true) - $t1;
$mem1 = memory_get_peak_usage(true);

$array = array();
$t2 = microtime(true);

for ($i = 0; $i < 100000; $i++) {
  $array[] = array(0=>array(0,1,2,3));
}

$time2 = microtime(true) - $t2;
$mem2 = memory_get_peak_usage(true);

$array = array();
$t3 = microtime(true);

for ($i = 0; $i < 100000; $i++) {
  $array[] = [0=>array(0,1,2,3)];
}

$time3 = microtime(true) - $t3;
$mem3 = memory_get_peak_usage(true);

print 'example 1 - ' . $time1 . ' - ' . $mem1 . '<br/>';
print 'example 2 - ' . $time2 . ' - ' . $mem2 . '<br/>';
print 'example 3 - ' . $time3 . ' - ' . $mem3 . '<br/>';

对我来说,我发现第一个示例的时间效率最低,但内存效率最高,示例 3 在时间上略优于 2,但在内存上是相等的

【讨论】:

  • 当我查看我的示例时,我发现了一个错误。您可以进行的测试的问题是,一个数组的大小在增长,而其他数组则覆盖了自己。我更新了答案底部的代码
  • 你提出了一个强项,我为自己感到羞耻。我也改变了我的鳕鱼
  • 你重新运行测试了吗?
  • 我做到了,我发现第一个示例的时间效率最低,但内存效率最高,示例 3 在时间上略微超过 2,但在内存上是相等的
  • 我已经有了,只是将 [] 添加到 $array 以防止覆盖和几个 $array = array() 在每次测试之前重置 $array 几乎没有什么区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多