0

我想从数组中取消设置每隔一个项目。我不在乎键是否重新排序。

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

4

6 回答 6

1

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

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

优点是,它不需要 if 语句,缺点$i是仍然需要变量 ( ),并且它仅在键是数字且没有间隙的情况下才有效。

于 2015-02-04T11:01:02.307 回答
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++;
}

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

于 2015-02-04T11:13:55.460 回答
0

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

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

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

于 2015-02-04T11:45:26.643 回答
0
 function arr_unset_sec(&$arr, $key)
 {
   if($key%2 == 0)
   {
     unset($arr[$key]);  
   }
 }
 array_walk($arr, 'arr_unset_sec');

假设 $arr 可能是一些数组。检查这段代码。

于 2015-02-04T11:22:02.910 回答
0

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

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

  1. $i++这是后增量。实际上,将首先评估该值,然后再增加该值。
  2. % 这是模运算符 - 它返回左侧值与右侧值相除的“余数”。
  3. 条件的返回值要么是正整数,要么是0正整数。出于这个原因,php 固有的“类型杂耍”功能可用于将正整数转换0为.falsetrue
  4. 在该array_filter()方法中,use()必须使用语法&$i以使变量是“可修改的”。没有&,$i将保持静态(不受后增量影响)。
  5. 在该方法中,与该方法相比foreach(),条件是倒置的。 想知道“保留”什么;想知道要做什么。!()array_filter()array_filter()foreach()unset()

代码:(演示

//                          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,
)
---
于 2017-12-15T22:01:16.960 回答
0
$n = 1
for( $i=$n;$i=$n;)
    {
        unset($arOne[$i]); 
        unset($arSnd[$i]);
        unset($arThd[$i]);
        break;
    }

我认为这也将完美。

于 2018-10-21T14:59:13.357 回答