0

我看不到这个问题的答案,但它一直困扰着我一段时间。

在php(或任何语言)中使用多维数组时,您是否通过将多维数组的数组保存为单独的数组或直接从整个数组访问该“数组”元素获得任何效率和生产力?

例如,
print_r($myArray);

Array
(
   [2] => Array
      (
         [7.0] => Array
            (
               [0] => 1
               [1] => 23
            )

         [16.0] => Array
            (
               [0] => 4
               [1] => 28
            )
      )
   [5] => Array
      (
         [17.0] => Array
            (
               [0] => 1
               [1] => 3
            )
      )
)   

如果我需要重复访问 [16.0] 的数组,最好将该条目保存为自己的数组,直到我不再需要它,还是直接访问它更好?

Option 1:
$tempArray=$myArray[2]["16.0"];
echo "Index=".$tempArray[0].";

或者

Option 2:
echo "Index=".$myArray[2]["16.0"][0];


当然这只是一个小例子,但是如果(任意)$array[.][.][ n ][...] 中的值被多次访问,并且n的值取决于一个循环,直接访问元素或将该数组(在数组的层的深处)保存为自己的数组并以这种方式访问​​其值之间有什么区别?

4

2 回答 2

2

如果您查看为这些语句生成的字节码:

$tempArray=$myArray[2]["16.0"];        
echo $tempArray[0];        
    FETCH_DIM_R        $3      $myArray, 2        
    FETCH_DIM_R        $4      $3, '16.0'        
    ASSIGN                     $tempArray, $4        
    FETCH_DIM_R        $6      $tempArray, 0        
    ECHO               $6        

echo $myArray[2]["16.0"][0];        
    FETCH_DIM_R        $7      $myArray, 2        
    FETCH_DIM_R        $8      $7, '16.0'        
    FETCH_DIM_R        $9      $8, 0        
    ECHO               $9        

(我已经重新格式化并删除了 EXT_STMT 标记)。您可以看到唯一的区别是对 $tempArray 的实际分配。你可能认为数组赋值很昂贵。但是 PHP 使用引用模型并执行惰性写入时复制,所以它不是,并且无论数组大小如何,成本都几乎相同。

(当然,如果您在分配后更改元素,则 $tempArray 不再与其原始切片相同,并且此时内存使用量会随着分配触发切片的克隆而跳跃,因为需要拆分引用。 )

好的,如果您对切片进行大量本地化只读访问以保存重复的FETCH_DIM_R查找(PHP 编译绝对不会对重复使用索引进行本地优化),这种方法可能是值得的。 但是,在更新时让自己陷入困境的机会非常重要。

为什么不使用循环和microtime()and自己对此进行基准测试memory_get_usage()

于 2012-07-11T08:49:04.167 回答
1

您可以通过使用 for 循环创建一个巨大的多维数组来轻松测试这一点,但是在索引大型数组时直接访问它通常会更快。

对于较小的数组(约 500 项或更少),它不会产生明显的差异。

于 2012-07-11T00:53:13.567 回答