【问题标题】:PHP Array Efficiency and Memory ClarificationPHP 数组效率和内存说明
【发布时间】:2011-03-03 13:19:26
【问题描述】:

在 PHP 中声明数组时,索引可能会乱序创建...即

数组[1] = 1 数组[19] = 2 数组[4] = 3

我的问题。在创建这样的数组时,长度是否为 19,中间有空值?如果我试图获取 Array[3] 它会是未定义的还是抛出错误?另外,这对记忆有何影响。 3个索引的内存会被占用还是19个?

目前还有一位开发人员编写了一个包含 3 个数组的脚本 FailedUpdates[] FailedDeletes[] FailedInserts[]

这样是不是效率更高,还是在关联数组控制多个子数组的情况下这样做

"Failures" array(){
    ["Updates"] => array(){
           [0] => 12
           [1] => 41
                   }
    ["Deletes"] => array(){
           [0] => 122
           [1] => 414
           [1] => 43
                   }
    ["Inserts"] => array(){
           [0] => 12
                   }
}

【问题讨论】:

    标签: php arrays memory memory-management


    【解决方案1】:

    内存效率在 PHP 中并不是你真正需要担心的事情,除非你正在处理非常庞大的数组/大量变量。

    PHP 中的数组并不像 C++ 或类似的低级语言中的数组。 PHP 中的数组是一个映射。您有一个键列表(必须是唯一的,并且都是字符串或整数类型),以及一个与键对应的值列表。所以下面是一个合法的数组:

    array(0 => 'butt', 1 => 'potato', 2 => 'tulip')

    但是

    array(5 => 'i', 'barry' => 6, 19 => array(-1 => array(), 7 => 'smock'))

    在这两种情况下,数组中都有 3 个条目,因此有 3 个键和 3 个值。

    除了数组中的键和值之外,一个数组可以通过键/值对出现的顺序与另一个数组区分开来。如果您定义一个数组,使其具有非负整数作为键,这通常是预期的顺序。当您使用 foreach() 之类的结构时,顺序很重要。

    【讨论】:

    • 您可以通过使用 SPLFixedArray 来使用 C 样式的数组。创建时间并没有快多少(快几个 %),但访问速度快了 20% 到 30%...
    • “如果你定义一个数组,使它有非负整数作为键,这通常是预期的顺序。”顺序与键的类型无关,仅与创建键的顺序有关。在 OP 给出的示例中,顺序为 1、19、3。
    • Artefacto:是的,我知道。我的评论并非旨在作为明确的规则,而是作为一般原则。很多时候,当你创建一个数组时,你是通过定义第 0 个条目,然后是第一个,然后是第二个等来实现的。在这种情况下,键将按照预期的顺序排列。当数组由返回由非负整数索引的数组的函数返回时,通常也会出现这种情况。如果数组元素是按“自然”顺序定义的,那么是的,它们将按照定义的任何顺序出现。
    • 我把“通常”这个词改成了“经常”,以使这句话更贴切。
    【解决方案2】:

    array[3] 将是未定义/未设置但不会导致错误,并且该数组将只使用这 3 个值的内存 - php 不像 C 中您必须查看这些内容。

    【讨论】:

      【解决方案3】:
      • 访问 $arr[3] 会发出通知:Notice: Undefined offset: 3 in /data/home/sjoerd/public_html/svnreps/test/a.php on line 3。您可以通过检查isset()array_key_exists() 来避免这种情况。
      • 没有存储空值。
      • 拥有空元素不会占用额外的内存。
      • 您应该使用多个变量还是数组取决于上下文以及您使用变量的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-01
        • 2012-09-20
        • 2014-05-04
        • 2012-01-11
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        相关资源
        最近更新 更多