PHP unset vs array_pop?

时间:2013-07-30 12:39:20

标签: php arrays unset

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

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

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

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

    如果没有,哪个更好?

10 个答案:

答案 0 :(得分:10)

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

unset($array[count($array) -1]);删除索引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的元素可能甚至不存在。索引集中可能存在间隙,整数索引可以与字符串索引混合使用。

答案 1 :(得分:9)

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"

答案 2 :(得分:4)

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

只需删除最后一个元素,array_pop会更好,因为您不需要执行count($array)-1,它更清晰,更易读。

答案 3 :(得分:2)

是的。

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

其次,假设你的数组是数字和连续的,那么仍然存在差异:

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

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

如果你不需要保留这个值,那么不,你使用哪一个并不重要,我怀疑array_pop()可能更快(因为不需要调用{{ 1}}),但我没有检查过,说实话,除非你做了数以千计的电话,否则无论如何差别都可以忽略不计。

答案 4 :(得分:1)

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

array_pop总是弹出最后一个 您的count - 1取消了一个元素的数字ID,只有当所有元素连续数字索引时才会按预期工作。

答案 5 :(得分:1)

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

该函数以递归方式调用自身,大约为7或8级,当然,我将$ whatevers设为静态,因此数组增长并缩小。

结果呢?这段代码与注释掉的区别在于Windows 7笔记本电脑上的百分之几秒是无法测量的。由于其他原因,它有很大差异,但在很多次运行中,平均值的差异毫无意义。

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

是的,存在差异

array_pop()也将返回删除的元素,例如:last元素和

unset()不会返回任何内容

答案 8 :(得分:0)

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

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

$array = array_slice($array, 0, -1, true);

答案 9 :(得分: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)
}

如您所见,新元素放置在索引3而不是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)
}

现在,新元素放置在索引2处。也许这是最可取的行为。