18

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

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

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

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

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

4

4 に答える 4

35

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

foreach ($arr as $key => $value) {
    if (!is_int($key)) {
        unset($arr[$key]);
    }
}
于 2012-06-14T23:07:00.683 に答える
24

これは、 1行(長い)にループを記述せずに実行できます。

$a = array_intersect_key($a, array_flip(array_filter(array_keys($a), 'is_numeric')));

内容:

  • 値を処理するためarray_filterarray_keys最初にキーを値として使用して新しい配列を作成します(元の値は無視します)。
  • 次に、これらは関数によってフィルタリングされis_numericます。
  • 次に、結果が反転されるため、キーは再びキーになります。
  • 最後にarray_intersect_key、上記の結果のキー(数値キー)を持つ元の配列からのみアイテムを取得します。

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

于 2013-08-28T14:01:26.817 に答える
21

PHP 5.6以降array_filter、コンパクトな形式で使用できるようになりました。

array_filter($array, function ($k) { return is_numeric($k); }, ARRAY_FILTER_USE_KEY);

デモ。

このアプローチは、私のボックスのループよりも約20%遅くなりforます(1.61秒対1M反復の1.31秒)。


PHP 7.4以降、短いクロージャを使用することもできます::

array_filter($array, fn($k) => is_numeric($k), ARRAY_FILTER_USE_KEY);
于 2016-07-19T14:44:06.470 に答える
6

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

foreach($arr as $key => $value) {
    if($key !== 0 and !intval($key)) {
         unset($arr[$key]);
    }
}
于 2012-06-14T23:07:29.157 に答える