PHP取消设置vs数组_pop?

PHP取消设置vs数组_pop?,php,arrays,unset,Php,Arrays,Unset,如果要删除数组的最后一个元素,可以使用以下两种代码之一: (未使用返回值) 它们之间是否存在性能或语义差异 如果没有,首选哪一个?取消设置如果您需要使用删除的值“执行”任何操作(除非您之前已将其分配到其他位置),则它不会返回任何内容,而array\u pop将为您提供最后一项内容 您提供的unset选项可能性能稍差,因为您正在计算数组的长度并对其执行一些数学运算,但我预计差异(如果有的话)可以忽略不计 正如其他人所说,如果你的数组是数值的和连续的,上面的说法是正确的,但是如果你的数组不是这样构

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

  • (未使用返回值)

  • 它们之间是否存在性能或语义差异


    如果没有,首选哪一个?

    取消设置
    如果您需要使用删除的值“执行”任何操作(除非您之前已将其分配到其他位置),则它不会返回任何内容,而
    array\u 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\u pop
    返回最后一个元素,而
    unset
    不返回任何内容

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

    是的

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

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

    array\u pop()
    还将返回弹出元素的值作为返回值<代码>取消设置()不会执行此操作

    因此,如果需要继续使用数据,请使用
    array\u pop()


    如果您不需要保留该值,那么不,您使用哪一个可能无关紧要,我怀疑
    array\u pop()
    可能更快(因为不需要调用
    count()
    ),但我没有检查,老实说,除非您正在进行数千次调用,这种差异无论如何都可以忽略不计。

    正如其他人所提到的,它们的功能是相同的,除了从
    array\u pop
    返回值之外。但是,还值得一提的是,由于调用
    count()

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

    array\u pop($array)
    删除
    $array
    的最后一个元素

    unset($array[count($array)-1])
    删除索引
    计数($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";
    
    印刷品


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

    是的,存在差异

    数组_pop()还将返回删除的元素,例如:最后一个元素,和


    unset()不会返回任何东西,除了调用语法和返回值的明显差异

    array\u pop
    总是弹出最后一个。
    您的
    count-1
    通过元素的数字id来取消元素的设置,只有在所有元素都连续进行数字索引的情况下,该id才能按预期的方式工作

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

    另一种选择是数组\u切片(数组、偏移、长度、保留\u键):


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

    该函数递归地调用自己,直到大约7或8个级别,(当然)我将$whatevers设置为静态,因此数组会不断增大和缩小

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


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

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

    取消 如您所见,新元素被放置在索引
    3
    处,而不是
    2

    数组_pop
    现在新元素被放置在索引
    2
    处。也许这是最理想的行为。

    array\u pop返回弹出的元素。我认为pop会更快,因为没有计数调用或减法操作。但我的意思是,这是一个你可能永远不会注意到的微观优化。我认为pop更具可读性,也更“一目了然”。@prodigitalson如果您的数组大小存在如此显著的差异,请考虑减小数组大小。这将是真正的优化,而不仅仅是一种感觉。
    unset($array[count($array)-1])不适用于关联数组或枚举数组,因为这些数组中存在间隙enumeration@Lix,是的,我的意思是这一点非常明确。。你看,分号显示这是完整的语句……不,不,这创建了一个新数组,这不是我想要的。我忘记了重写数组的返回值
    
    0 => foo
    2 => bar
    1 => baz
    
    $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)
    }
    
    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)
    }