【问题标题】:How to unset when only knowing a key's numerical order仅知道键的数字顺序时如何取消设置
【发布时间】:2016-10-18 12:33:28
【问题描述】:

我想从数组中取消设置,但我只知道每个键的数字顺序。

删除它们的最佳方法是什么?

$arr = [
    'horse' => true,
    'rabbit' => false,
    'cat' => true,
    'dog' => false,
    'sheep' => false,
];

$remove = [0,1,3];

想要的结果:

$arr = [
    'cat' => true,
    'sheep' => false,
];

【问题讨论】:

    标签: php arrays unset


    【解决方案1】:

    这是一个有趣的方式:

    $arr = array_intersect_key($arr,
                               array_flip(array_diff_key(array_keys($arr),
                                                         array_flip($remove))));
    
    • 翻转删除数组以获取作为键的值
    • 获取这些键与主数组的整数键之间的差异
    • 翻转它并获取与主数组相交的键的值

    这里更有趣:

    $arr = array_filter($arr, function($v) use($remove) {
                                    static $k = 0; return !in_array($k++, $remove);
                              });
    
    • 使用从 0 开始递增计数器的函数过滤数组
    • 如果计数器在删除数组中不是!,则返回true,如果是,则返回false

    【讨论】:

      【解决方案2】:

      您需要使用array_keys (http://php.net/manual/en/function.array-keys.php)。

      <?php
      $arr = [
          'horse' => true,
          'rabbit' => false,
          'cat' => true,
          'dog' => false,
          'sheep' => false,
      ];
      $keys = array_keys($arr);
      
      $remove = [0,1,3];
      
      foreach($remove as $key) {
          unset($arr[$keys[$key]]);
      }
      
      var_dump($arr);
      

      【讨论】:

      • @mistermartin 对不起。来自 PHP 文档:array_keys() 从数组中返回键、数字和字符串。返回数组中所有键的数组。
      • 你的 foreach 说 $key 实际上是值。
      • 是的。 @mistermartin 请仔细看。这里的数组是$remove,里面包含了需要删除的索引值。
      • 您通过执行$arr = array_keys($arr); 仅用其键覆盖了$arr
      • 现在和我的回答完全一样。连变量名都一样。
      【解决方案3】:

      使用array_keys获取实际的key,然后使用索引获取对应的key。

      $arr_keys = array_keys($arr);
      foreach ($remove as $r) {
          unset($arr[$arr_keys[$r]]);
      }
      

      【讨论】:

      • 我喜欢这个简短的答案。
      【解决方案4】:

      你可以这样做,

      $counter = 0;
      foreach($arr as $key => $value){
          if(in_array($counter, $remove)){
              unset($arr[$key]);
          }
          ++$counter;
      }
      
      // display $arr array
      var_dump($arr);
      

      这是live demo

      【讨论】:

        猜你喜欢
        • 2014-02-01
        • 2015-11-02
        • 1970-01-01
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多