web-dev-qa-db-ja.com

数値以外のキーを持つ配列のすべての要素を削除します

私は次のような配列を持っています:

Array
(
    [0] => Apple
    ["b"] => banana
    [3] => cow
    ["wrench"] => duck
)

その配列を取得し、array_filterなどを使用して、数値以外のキーを持つ要素を削除し、次の配列を受け取ります。

Array
(
    [0] => Apple
    [3] => cow
)

私はこれについて考えていましたが、array_filterが関数にキーを提供せず、array_walkが配列構造を変更できないため、これを行う方法を考えることができませんでした(PHPマニュアルで説明) )。

16
diracdeltafunk

この場合、 foreach ループを使用するのが適切です。

foreach ($arr as $key => $value) {
    if (!is_int($key)) {
        unset($arr[$key]);
    }
}
29
Tim Cooper

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は、上記の結果のキー(数値キー)を持つ元の配列からのみアイテムを取得します。

ただし、パフォーマンスについては聞かないでください。

22
smhg

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);
15
bishop

ループは次のとおりです。

foreach($arr as $key => $value) {
    if($key !== 0 and !intval($key)) {
         unset($arr[$key]);
    }
}
6
Scott Saunders