仅知道键的数字顺序时如何取消设置

How to unset when only knowing a key's numerical order

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

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

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

$remove = [0,1,3];

想要的结果:

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

你可以这样做,

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

// display $arr array
var_dump($arr);

这是live demo

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

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

您需要使用 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);

这是一个有趣的方法:

$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 开始递增计数器的函数过滤数组
  • Return true 如果计数器不在删除数组中 ! 并且 false 如果它是