私は次のような配列を持っています:
Array
(
[0] => Apple
["b"] => banana
[3] => cow
["wrench"] => duck
)
その配列を取得し、array_filterなどを使用して、数値以外のキーを持つ要素を削除し、次の配列を受け取ります。
Array
(
[0] => Apple
[3] => cow
)
私はこれについて考えていましたが、array_filterが関数にキーを提供せず、array_walkが配列構造を変更できないため、これを行う方法を考えることができませんでした(PHPマニュアルで説明) )。
この場合、 foreach
ループを使用するのが適切です。
foreach ($arr as $key => $value) {
if (!is_int($key)) {
unset($arr[$key]);
}
}
one(long)line:にループを記述せずに実行できます。
$a = array_intersect_key($a, array_flip(array_filter(array_keys($a), 'is_numeric')));
内容:
array_filter
は値を処理するため、array_keys
は最初に、キーを値として使用して新しい配列を作成します(元の値は無視します)。- 次に、これらは
is_numeric
関数によってフィルタリングされます。- その結果、反転されるため、キーは再びキーになります。
- 最後に、
array_intersect_key
は、上記の結果のキー(数値キー)を持つ元の配列からのみアイテムを取得します。
ただし、パフォーマンスについては聞かないでください。
PHP 5.6以降、array_filter
をコンパクトな形式で使用できるようになりました。
array_filter($array, function ($k) { return is_numeric($k); }, ARRAY_FILTER_USE_KEY);
このアプローチは、私のボックスのfor
ループよりも約20%遅くなります(100万回の反復で1.61秒対1.31秒)。
PHP 7.4以降、短いクロージャを使用することもできます::
array_filter($array, fn($k) => is_numeric($k), ARRAY_FILTER_USE_KEY);
ループは次のとおりです。
foreach($arr as $key => $value) {
if($key !== 0 and !intval($key)) {
unset($arr[$key]);
}
}