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
 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
(
    [0] => test1
    [1] => test2
    [2] => test3
    [3] => test4
    [4] => test5
)

次に、以下のコードを使用できます。配列の 2 つおきの項目が削除されます。

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

これがお役に立てば幸いです。さらにサポートが必要な場合はお知らせください。

于 2015-02-04T11:13:55.460 に答える
0

条件を利用して削除する要素をターゲットにする 2 つのメソッド (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 に答える