10

如果我想删除数组的最后一个元素,我可以使用以下两个代码之一:

  1. array_pop($array);(不使用返回值)

  2. unset($array[count($array) -1]);

它们之间是否有任何性能或语义差异?

如果不是,首选哪个?

4

10 回答 10

12

unset如果您需要使用已删除的值“做”任何事情(除非您之前已将其分配给其他地方),那是不好的,因为它不会返回任何东西,而array_pop会给您最后一项的东西。

unset由于您正在计算数组的长度并对其执行一些数学运算,因此您提供的选项的性能可能略低,但我希望差异(如果有的话)可以忽略不计。

正如其他人所说,如果您的数组是数字且连续的,则上述情况是正确的,但是如果您的数组不是这样的结构,事情就会变得复杂

例如:

<?php
$pop = $unset = array(
  1 => "a",
  3 => "b",
  0 => "c"
);

array_pop($pop);

// array looks like this:
//  1 => "a", 3 => "b"

$count = count($unset) - 1;
unset($count);
// array looks like this because there is no item with index "2"
//  1 => "a", 3 => "b", 0 => "c"
于 2013-07-30T12:42:07.803 回答
10

array_pop($array)删除 的最后一个元素$array

unset($array[count($array) -1]);删除 index 处的元素count($array) -1。该元素不一定是数组的最后一个元素。

考虑$array = array(0 => 'foo', 2 => 'bar', 1 => 'baz')。在这种情况下,$array[1]是最后一个元素。编码

foreach (array(0 => "foo", 2 => "bar", 1 => "baz") as $key => $value)
  echo "$key => $value\n";

印刷

0 => foo
2 => bar
1 => baz

此外,索引处的元素count($array) -1甚至可能不存在。索引集合中可能存在间隙,整数索引可以与字符串索引混合。

于 2013-07-30T12:44:38.063 回答
5

返回值不同。 array_pop返回最后一个元素,whileunset不返回任何内容。

对于简单地删除最后一个元素,array_pop会更好,因为您不需要执行count($array)-1,而且它更干净,更具可读性。

于 2013-07-30T12:42:23.923 回答
2

就在这里。

首先,该unset()选项仅适用于数值连续的数组。如果您的数组包含非数字元素,或者其数字序列中有任何间隙,则unset()调用将从中获取不正确的值count()并失败。

其次,假设您的数组是数字且连续的,仍然存在差异:

array_pop()还会将弹出元素的值作为返回值返回给您。unset()不会这样做。

因此,如果您需要继续使用数据,请使用array_pop().

如果您不需要保留该值,那么不,您使用哪一个可能并不重要,我怀疑array_pop()可能会更快(由于不需要调用count()),但我没有检查,并且老实说,除非您要打数千个电话,否则差异无论如何都可以忽略不计。

于 2013-07-30T12:43:18.620 回答
1

除了调用语法和返回值的明显差异...

array_pop总是弹出最后一个。
您通过其数字 id 取消设置元素,如果所有元素都连续数字索引count - 1,则它只会按您期望的方式工作。

于 2013-07-30T12:46:11.913 回答
1

对于它的价值,使用一些在运行中被调用超过 2000 次的现有代码,我在顶部放入了 $whatevers[]=$whatever (参数值)和 array_pop($whatevers)底部。

该函数将自身递归调用到大约 7 或 8 个级别,并且(当然)我将 $whatevers 设为静态,因此数组会增长和缩小。

结果?在 Windows 7 笔记本电脑上,这段代码的输入和注释之间的差异无法测量到 100 分之一秒。由于其他原因,它的变化相当大,但经过多次运行,平均值的差异是没有意义的。

array_pop() 的性能开销不值得再考虑,虽然 unset 理论上可能更快,但没有人能够检测到差异。

于 2014-03-26T14:06:12.397 回答
0

正如其他人所提到的 - 它们的功能是相同的,禁止返回值来自array_pop. 但是,还值得一提的是,unset由于count()调用,该方法在大型数组上可能存在性能问题。

正如 Oswald 所提到的,还值得注意的是,它unset()只会在数字键上按预期工作。

于 2013-07-30T12:44:22.000 回答
0

是,有一点不同

array_pop() 还将返回删除的元素,例如:最后一个元素,并且

unset() 不会返回任何东西

于 2013-07-30T12:44:52.233 回答
0

我更喜欢 unset() 但你调用 count() 会消耗性能。

另一种选择是 array_slice(array, offset, length, preserve_keys) :

$array = array_slice($array, 0, -1, true);
于 2013-07-30T12:47:54.160 回答
0

另一个需要考虑的因素是,如果在删除最后一项后推送一个新元素,则会得到不同的结果,新元素所在的索引是:

未设置

php > $a = [1,2,3];
php > var_dump($a);
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
php > unset($a[2]);
php > var_dump($a);
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}
php > $a[] = 5;
php > var_dump($a);
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [3]=>
  int(5)
}

如您所见,新元素放置在 index3而不是2.

array_pop

php > $a = [1,2,3];
php > var_dump($a);
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
php > array_pop($a);
php > var_dump($a);
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}
php > $a[] = 5;
php > var_dump($a);
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(5)
}

现在新元素被放置在 index 处2。也许这是最理想的行为。

于 2019-07-17T08:58:55.013 回答