PHP unset vs array_pop?


PHP unset vs array_pop?

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

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

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

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

如果没有,首选哪一个?

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"

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

CCD_ 8移除索引CCD_ 9处的元素。这个元素不一定是数组的最后一个元素。

$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处的元素甚至可能不存在。索引集合中可能存在间隙,整数索引可以与字符串索引混合。

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

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

是的。

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

其次,假设你的数组是数字的和连续的,仍然有区别:

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

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

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

除了调用语法和返回值有明显差异外。。。

array_pop总是弹出最后一个
count - 1根据元素的数字id取消设置元素,只有当所有元素都是连续数字索引时,该id才能正常工作。

值得一提的是,使用一段在一次运行中被调用2000多次的现有代码,我在顶部放入$whatevers[]=$whatever(参数值),在底部放入array_pop($whatevers)。

该函数递归地将自己调用到大约7或8个级别,(当然)我将$whatevers设置为静态,这样数组就会增长和收缩。

结果如何?在windows 7笔记本电脑上,这个代码输入和注释输出之间的差异是无法测量的,低至100分之一秒。由于其他原因,它有很大的变化,但在很多次跑步中,平均值的差异是没有意义的。

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

正如其他人所提到的,它们的功能是相同的,除了array_pop的返回值。然而,还值得一提的是,由于count()调用,unset方法在大型阵列上可能存在性能问题。

正如奥斯瓦尔德所提到的,同样值得注意的是,unset()只能在数字键上按预期工作。

是的,存在差异

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

unset()不会返回任何东西

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

另一种选择是array_slice(数组、偏移量、长度、preserve_keys):

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

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

取消设置

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处。也许这是最令人向往的行为。