【问题标题】:PHP unset vs array_pop?PHP未设置与array_pop?
【发布时间】:2013-07-30 14:44:45
【问题描述】:

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

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

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

它们之间有性能或语义上的区别吗?

如果不是,哪个是首选?

【问题讨论】:

  • array_pop 返回弹出的元素。
  • 我认为 pop 会更快,因为没有计数调用或减法。但我的意思是那是你可能永远不会注意到的微优化。我认为 pop 更具可读性,更“一目了然”。
  • @prodigitalson 如果您的数组大小的差异会非常明显 - 考虑减小数组大小。这将是真正的优化,而不仅仅是一种感觉。
  • unset($array[count($array) -1]); 不适用于关联数组或枚举中有间隙的枚举数组

标签: php arrays unset


【解决方案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"

【讨论】:

    【解决方案2】:

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

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

    考虑$array = array(0 =&gt; 'foo', 2 =&gt; 'bar', 1 =&gt; '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 处的元素甚至可能不存在。索引集合中可以有间隙,整数索引可以与字符串索引混合。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • @Lix,是的,我的意思是这一点非常明确.. 你看到分号表明 that 是完整的陈述......
      【解决方案4】:

      是的。

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

      其次,假设你的数组是数字且连续的,还是有区别的:

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

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

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

      【讨论】:

        【解决方案5】:

        除了调用语法和返回值有明显区别...

        array_pop 总是弹出最后一个。
        您的 count - 1 通过其数字 id 取消设置元素,只有当所有元素都连续数字索引时,它才能按预期工作。

        【讨论】:

          【解决方案6】:

          对于它的价值,使用一些在运行中被调用超过 2000 次的现有代码,我在顶部和 array_pop($不管怎样)在底部。

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

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

              是的,有区别

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

              unset() 不会返回任何东西

              【讨论】:

                【解决方案9】:

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

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

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

                【讨论】:

                • 不不,这会创建一个新数组,这不是我想要的。
                • 我忘记了重写数组的返回值
                【解决方案10】:

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

                未设置

                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。也许这是最理想的行为。

                【讨论】:

                  猜你喜欢
                  • 2011-07-03
                  • 2015-02-03
                  • 1970-01-01
                  • 2011-05-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-11
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多