【问题标题】:PHP Array and ArrayObjectPHP 数组和 ArrayObject
【发布时间】:2010-11-26 21:21:08
【问题描述】:

应该使用哪一个来操作数据,数组还是数组对象? 像搜索、排序和其他数组操作。

【问题讨论】:

  • 你有你想做什么的例子吗?
  • 我需要使用 Array 进行搜索、排序和其他复杂的操作,以便在算法中使用它。所以我需要知道哪个更好更快。

标签: php arrays arrayobject


【解决方案1】:

基本类型是array。这是一个可以循环写入、读取和访问的键和值的映射。

ArrayObject 是一个类,您可以扩展该类以创建行为就像数组一样的对象。它实现了像countsort 这样的方法,使您能够像对待数组一样对待对象。它是 SPL(标准 PHP 库)的一部分。

通常你会使用array。你会知道什么时候需要ArrayObject

【讨论】:

    【解决方案2】:

    就性能而言,您不会注意到arrayArayObject 之间的真正区别。 我运行了一个简单的测试。这个想法是使用 array() 和 new ArrayObject 创建数组,并用越来越多的值填充它们。

    <?php
    for($i = 0; $i < 2; $i++){
        $method = $i == 0 ? 'array' : 'ArrayObject';
        for($j = 0; $j < 7 ; $j++){
            for($k = 0; $k < 100; $k++){
                $max    = pow(10,$j);
                $array  = $method == 'array' ? array() : new ArrayObject;
                $time   = explode(' ',microtime());
                $sTime  = $time[0] + $time[1];
                for($l = 0; $l < $max; $l++){
                    $array[] = 'foo ' . $i . ':' . $j . ':' . $k . ':' . $l;
                }
                $time  = explode(' ',microtime());
                $eTime = $time[0] + $time[1];
                $results[$method][$max][]    = $eTime - $sTime;
            }
        }
    }
    ?>
    

    结果

    method             lines     average (µs)    difference between methods (µs)
    array                  1           2.470         -1.044
    array                 10           8.452         +0.315
    array                100          71.862        +10.719
    array              1,000         773.826       +141.962
    array             10,000       7,868.731       -675.359
    array            100,000      76,954.625    -17,665.510
    array          1,000,000     801,509.550    -84,356.148
    ArrayObject            1           3.514         +1.044
    ArrayObject           10           8.137         -0.315
    ArrayObject          100          61.142        -10.719
    ArrayObject        1,000         631.864       -141.962
    ArrayObject       10,000       8,544.090       +675.359
    ArrayObject      100,000      94,620.135    +17,665.510
    ArrayObject    1,000,000     885,865.698    +84,356.148
    

    平均值是每种方法和每个行数的 100 次测试的平均时间。 方法之间的差异非常微不足道(处理一百万行时需要 84 微秒...)

    我已经多次运行这个测试,因为差异总是一个微秒的问题,有时一个方法在一次测试中效率更高,在下一次测试中效率较低......

    选择取决于您的需求:

    • 如果您处理简单的数组,并执行类似 foreach() 的循环或计算平均值,则 array 就足够了,
    • 如果您需要更复杂的迭代、排序、过滤......使用您自己的迭代器、方法扩展 ArrayObject class 会更容易......

    【讨论】:

    • 请指定php的版本,这很重要。
    • 在我看来,当您处理一百万行时,差异是 84 毫秒(84 365 微秒)......不是那个差异在大多数情况下很重要。
    【解决方案3】:

    arrayObject 在需要序列化时最有用。

    你也可以通过扩展arrayObject来创建你自己的集合类。然后你可以序列化你的类对象来传输数据。

    对于简单常用的操作,array 比 arrayObject 更受欢迎。

    【讨论】:

      【解决方案4】:

      您将array 用于简单(和标准)数组

      ArrayObject 是一个类,可用于增强您自己的类以用作数组(比如您的一些集合类)

      【讨论】:

      • ArrayObject 不是抽象类。
      【解决方案5】:

      大多数情况下,只需要一个数组即可。 ArrayObject 在扩展特定用途的功能时最有用。

      【讨论】:

        【解决方案6】:

        可以扩展数组对象并覆盖函数。 例如,您的 append() 函数可以在调用 parent::append() 之前将数字格式化为两位小数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多