PHP表达资源消耗

时间:2015-07-16 09:56:01

标签: php arrays

我有以下内容:

$fileMetadata[$key][0] ="";
$fileMetadata[$key][1] = $message->getSubject();
$fileMetadata[$key][2] = //Expresion
...
$fileMetadata[$key][0] =Expresion;

我需要使用索引0,1,2来订购数组,这就是为什么我要做的第一件事是分配""在cero中排列。我也可以这样做:

$fileMetadata[$key][1] = $message->getSubject();
$fileMetadata[$key][2] = //Expresion
...
$fileMetadata[$key][0] =Expresion
$fileMetadata[$key] = array_values($fileMetadata[$key]);

我没有测试第二个,我很确定第一个实现消耗的资源少得多,但我并不是100%肯定。谁能确认一下? 除此之外。我在哪里可以找到PHP函数实现的算法?

1 个答案:

答案 0 :(得分:2)

是的,您的第一种方法更有效率,因为您将在第二种方法中使用O(n*2)并最终消耗两倍的内存,因为您将阵列复制到新阵列中。

array_values的实施可以在ext/standard/array.c的{​​{1}}中找到,从第2968行开始。

实现是非破坏性的,这意味着它将基于给定的参数数组创建一个新的值数组,从而丢弃键。 PHP中此函数的等效实现看起来像这样......

function array_values(Array $array) {
    $newArray = [];
    foreach($array as $value) {
        $newArray[] = $value;
    }
    return $newArray;
}

虽然您可能会从这个实现中注意到,它根本不会改变数组中元素的顺序。它只是使用从0开始的数字键重新创建数组。

所以,例如,在你的数组......

$array = [
    1 => 'foo',
    2 => 'bar',
    0 => 'baz'
];

array_values($array)会给你......

array(3) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(3) "baz"
}

请注意,即使密钥现在是baz而不是20仍然是最后的。如果我正确理解您的要求,这可能不一定是您想要的。

我会坚持你的第一种方法。