【问题标题】:array_pop() with Keyarray_pop() 带键
【发布时间】:2011-08-03 21:16:32
【问题描述】:

考虑以下数组

$array = array('fruit'     => 'apple',
               'vegetable' => 'potato',
               'dairy'     => 'cheese');

我想使用array_pop 来获取最后一个键/值对。

但是,会注意到以下内容之后

$last = array_pop($array);

var_dump($last);

它只会输出值(string(6) "cheese"

如何从数组中“弹出”最后一对,同时保留键/值数组结构?

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    查看array_slice()http://php.net/manual/en/function.array-slice.php

    最后一个参数true 是保留密钥。

    当您将偏移量作为负数传递时,它从末尾开始。在不计算总数的情况下获取最后一个元素是一个不错的技巧。

    $array = [
        "a" => 1,
        "b" => 2,
        "c" => 3,
    ];
    
    $lastElementWithKey = array_slice($array, -1, 1, true);
    
    print_r($lastElementWithKey);
    

    输出:

    Array
    (
        [c] => 3
    )
    

    【讨论】:

    • 如果您的密钥是数字,请确保设置 preserve_keys = true 否则您可能无法获得预期的配对!
    • 这会起作用,但是作为示例执行三重内联语句可能会让新手感到困惑,绝对不建议在代码中使用该部分。
    • 这个答案不会修改数组。是的,对于获取最后一个键/值对,它足够有效,但是问题想要“弹出”并获取最后一个键/值对。所以,你应该在之后添加一个array_pop()(这会降低性能)。
    【解决方案2】:

    试试

    end($array); //pointer to end
    each($array); //get pair
    

    【讨论】:

    • 注意:each() 自 PHP 7.2.0 起已弃用(评论时为当前未成年人。)
    • each() 函数从 PHP 8.0 开始被删除。
    【解决方案3】:

    您可以使用end()key() 对键和值,然后您可以弹出值。

    $array = array('fruit' => 'apple', 'vegetable' => 'potato', 'dairy' => 'cheese');
    $val = end($array); // 'cheese'
                        // Moves array pointer to end
    $key = key($array); // 'dairy'
                        // Gets key at current array position
    array_pop($array); // Removes the element
                       // Resets array pointer
    

    【讨论】:

      【解决方案4】:

      为什么不使用新功能?以下代码适用于 PHP 7.3:

      // As simple as is!
      $lastPair = [array_key_last($array) => array_pop($array)];
      

      上面的代码简洁高效(正如我测试的那样,对于具有 10000 个元素的数组,它比 array_slice() + array_pop() 快大约 20%;原因是 array_key_last() 非常快)。这样最后一个值也将被删除。

      提示:你也可以分别提取key和value:

      [$key, $value] = [array_key_last($array), array_pop($array)];
      

      【讨论】:

        【解决方案5】:

        这应该可行,只是不要在 foreach 循环中执行(它会弄乱循环)

        end($array); // set the array pointer to the end
        $keyvaluepair = each($array);  // read the key/value
        reset($array); // for good measure
        

        编辑:Briedis 建议 array_slice() 这可能是一个更好的解决方案

        【讨论】:

        • each() 函数自 PHP 7.2 起已弃用,自 PHP 8.0 起已删除。
        【解决方案6】:

        另一种选择:

        <?php
        end($array);
        list($key, $value) = each($array);
        array_pop($array);
        var_dump($key, $value);
        ?>
        

        【讨论】:

          【解决方案7】:

          试试这个:

          <?php
          
          function array_end($array)
          {
              $val = end($array);
              return array(array_search($val, $array) => $val);
          }
          
          $array = array(
              'fruit' => 'apple',
              'vegetable' => 'potato',
              'dairy' => 'cheese'
          );
          
          echo "<pre>";
          print_r(array_end($array));
          ?>
          

          输出:

          Array
          (
              [dairy] => cheese
          )
          

          【讨论】:

            猜你喜欢
            • 2011-05-03
            • 2011-07-03
            • 2013-07-30
            • 2015-02-03
            • 2014-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多