web-dev-qa-db-ja.com

array_filter()の後、キーを0から始まる番号順にリセットするにはどうすればよいですか

Array_filterを使用して、値 ''のみを持つエントリを配列から削除し、0から始まるプレースホルダーに応じて特定の変換を適用したいのですが、残念ながら元のインデックスは保持されます。私はしばらく探して何も見えませんでした。たぶん明白なものを見逃しただけかもしれませんが、私の質問は...

古いインデックスを保持するのではなく、配列のインデックスを簡単にリセットして0から始まり、新しい配列に順番に移動するにはどうすればよいですか?

88
jel402

array_values 配列では、ゼロから再インデックス付けされます。

188

配列フィルターを使用している場合は、次のようにします

$NewArray = array_values(array_filter($OldArray));
26
user2182143

何人のプログラマーが無邪気にarray_values(array_filter())メソッドをコードにコピー/ペーストしたか心配です-知らずに何人のプログラマーが走ったのでしょうかarray_filterの貪欲のために問題になります。さらに悪いことに、関数が配列からあまりにも多くの値を削除することを発見したことがない人がどれだけいるか...

配列からNULL要素を取り除き、キーのインデックスを再作成する2つの部分から成るプロセスのより良い代替案を提示します。

ただし、最初に、array_filter()の貪欲な性質と、これがプロジェクトを静かにモンキーレンチする方法を強調することが非常に重要です。トラブルを露呈する混合値を持つ配列は次のとおりです。

$array=['foo',NULL,'bar',0,false,null,'0',''];

NULL値は、大文字/小文字に関係なく削除されます。

しかし、 array_values()array_filter() を使用するときに配列に残っているものを見てください:

array_values(array_filter($array));

出力配列($ array):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

array_walk()is_null() を使用して新しいフィルターされた配列を生成するメソッドで得られるものを見てみましょう。

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

これは、読みやすく/説明しやすいように複数行にわたって記述できます。

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

出力配列($ filter):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

私の方法を使用すると、再インデックス化されたキー、null以外のすべての値、nullの値は取得できません。アレイのヌルフィルタリングのすべてのニーズに対応する、クリーンでポータブルで信頼性の高いワンライナー。 デモ です。



同様に、空、false、およびnull要素(ゼロを保持)を削除する場合は、次の4つのメソッドが機能します。

var_export(array_values(array_diff($array,[''])));

または

var_export(array_values(array_diff($array,[null])));

または

var_export(array_values(array_diff($array,[false])));

または

var_export(array_values(array_filter($array,'strlen')));

出力:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

最後に、言語構造の構文を好む人は、修飾値を新しい配列にプッシュして、新しいインデックスを発行することもできます。

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
11
mickmackusa

array_values()を使用します。

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
10
Ed Mazur