配列からすべての項目を設定解除したい。キーが並べ替えられているかどうかは気にしません。
もちろん、私はそれを速くてエレガントにしたい. ループと一時変数なしで可能でしょうか?
配列からすべての項目を設定解除したい。キーが並べ替えられているかどうかは気にしません。
もちろん、私はそれを速くてエレガントにしたい. ループと一時変数なしで可能でしょうか?
これまでの私自身の解決策:
for ( $i = 1; isset($arr[$i]); $i += 2) {
unset($arr[$i]);
}
長所は、if ステートメントを必要としないこと、変数 ( $i
) がまだ必要であり、キーが数値でギャップがない場合にのみ機能するという短所です。
function arr_unset_sec(&$arr, $key)
{
if($key%2 == 0)
{
unset($arr[$key]);
}
}
array_walk($arr, 'arr_unset_sec');
$arr が何らかの配列であると仮定します。このコードを確認してください。
次のような配列がある場合
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++;
}
これがお役に立てば幸いです。さらにサポートが必要な場合はお知らせください。
条件を利用して削除する要素をターゲットにする 2 つのメソッド (array_filter()
およびforeach()
ループ) を提供します。$i++%$n
どちらの方法も、インデックス付き配列と連想配列で機能します。
$i++
これがポストインクリメントです。実際には、値が最初に評価され、次にインクリメントされます。%
これはモジュロ演算子です。右側の値から左側の値を除算して「剰余」を返します。0
または正の整数のいずれかになります。このため、php 固有の「型ジャグリング」機能を使用して、正の整数を に変換0
することができます。false
true
array_filter()
メソッドでは、変数が「変更可能」になるように構文をuse()
使用する必要があります。&$i
がなければ、&
静的$i
なままになります (ポストインクリメントの影響を受けません)。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,
)
---