从数组中删除每个第n项

时间:2015-02-04 11:01:02

标签: php arrays array-unset

我想从数组中取消设置每个第二项。我不关心密钥是否重新排序。

当然,我希望它快速而优雅。是否可能没有循环和临时变量?

6 个答案:

答案 0 :(得分:0)

到目前为止我自己的解决方案:

for ( $i = 1; isset($arr[$i]); $i += 2) { 
    unset($arr[$i]);
}

专业人士认为,它不需要if语句,即变量($i)仍然需要,并且仅当键是数字且无间隙时才有效。

答案 1 :(得分:0)

如果您有像

这样的数组
Array
(
    [0] => test1
    [1] => test2
    [2] => test3
    [3] => test4
    [4] => test5
)

然后你可以使用下面的代码。它将删除每个第二项数组。

$i = 1;
foreach ($demo_array as $key => $row) {
    if($i%2 == '0')
    {
        unset($demo_array[$key]);
    }
    $i++;
}

希望这会对你有所帮助。如果您需要任何进一步的帮助,请告诉我们。

答案 2 :(得分:0)

 function arr_unset_sec(&$arr, $key)
 {
   if($key%2 == 0)
   {
     unset($arr[$key]);  
   }
 }
 array_walk($arr, 'arr_unset_sec');

假设$ arr可能是某个阵列。检查这段代码。

答案 3 :(得分:0)

没有循环的另一种解决方案:

$arr = array('a', 'b', 'c', 'd', 'e');
$arr = array_filter( $arr, function($k) { return $k % 3 === 0; }, ARRAY_FILTER_USE_KEY);

亲,它不需要循环。缺点,它比我的其他版本(使用for循环)慢很多,看起来有点可怕,并且再次依赖于键。

答案 4 :(得分:0)

我将提供两种方法(array_filter()和一个foreach()循环),它们将利用条件$i++%$n来定位要删除的元素。

这两种方法都适用于索引和关联数组。

  1. $i++这是后增量。实际上,将首先评估该值,然后再增加该值。
  2. %这是模运算符 - 它返回"余数"来自右侧值的左侧值的划分。
  3. 条件的返回值将为0或正整数。出于这个原因,php的固有"类型杂耍"功能可用于将0转换为false,将正整数转换为true
  4. array_filter()方法中,use()语法必须使用&$i,以便变量为"可修改"。如果没有&$i将保持不变(不受后期增量影响)。
  5. foreach()方法中,与!()方法相比,条件被反转array_filter()array_filter()想要了解"保持&#34 ;; foreach()想要了解unset()
  6. 的内容

    代码:(Demo

    //                          if:$n=2        $n=3        $n=4        $n=5
    $array=['first'=>1,
            2,                  // remove
            'third'=>3,         //             remove
            'fourth'=>4,        // remove                  remove
            5,                  //                                     remove
            6,                  // remove      remove
            'seventh'=>7,
            'eighth'=>8,        // remove                  remove
            'ninth'=>9];        //             remove
    
    // if $n is 0 then don't call anything, because you aren't attempting to remove anything
    // if $n is 1 then you are attempting to remove every element, just re-declare as $array=[]
    
    for($n=2; $n<5; ++$n){
        $i=1;  // set counter
        echo "Results when filtering every $n elements: ";
        var_export(array_filter($array,function()use($n,&$i){return $i++%$n;}));
        echo "\n---\n";
    }
    
    echo "\n\n";
    // Using a foreach loop will be technically faster (only by a small margin) but less intuitive compared to
    // the literal/immediate interpretation of "array_filter".
    
    for($n=2; $n<5; ++$n){
        $i=1;
        $copy=$array;
        foreach($copy as $k=>$v){
            if(!($i++%$n)) unset($copy[$k]);  // or $i++%$n==0 or $i++%$n<1
        }
        echo "Results when unsetting every $n elements: ";
        var_export($copy);
        echo "\n---\n";
    }
    

    输出:

    Results when filtering every 2 elements: array (
      'first' => 1,
      'third' => 3,
      1 => 5,
      'seventh' => 7,
      'ninth' => 9,
    )
    ---
    Results when filtering every 3 elements: array (
      'first' => 1,
      0 => 2,
      'fourth' => 4,
      1 => 5,
      'seventh' => 7,
      'eighth' => 8,
    )
    ---
    Results when filtering every 4 elements: array (
      'first' => 1,
      0 => 2,
      'third' => 3,
      1 => 5,
      2 => 6,
      'seventh' => 7,
      'ninth' => 9,
    )
    ---
    
    
    Results when unsetting every 2 elements: array (
      'first' => 1,
      'third' => 3,
      1 => 5,
      'seventh' => 7,
      'ninth' => 9,
    )
    ---
    Results when unsetting every 3 elements: array (
      'first' => 1,
      0 => 2,
      'fourth' => 4,
      1 => 5,
      'seventh' => 7,
      'eighth' => 8,
    )
    ---
    Results when unsetting every 4 elements: array (
      'first' => 1,
      0 => 2,
      'third' => 3,
      1 => 5,
      2 => 6,
      'seventh' => 7,
      'ninth' => 9,
    )
    ---
    

答案 5 :(得分:0)

EOF

我认为这也将完美。