何人のプログラマーが無邪気にarray_values(array_filter())
メソッドをコードにコピー/ペーストしたのか心配しています -array_filterの貪欲さのために、無意識のうちに何人のプログラマーが問題に遭遇したのでしょうか。さらに悪いことに、関数が配列からあまりにも多くの値を削除することを発見したことがない人の数...
NULL
配列から要素を取り除き、キーのインデックスを再作成するという2つの部分からなるプロセスのより良い代替案を紹介します。
ただし、最初に、私は貪欲な性質を強調し、array_filter()
これがどのようにして静かにプロジェクトをモンキーレンチすることができるかを強調することが非常に重要です。ここに問題を露呈する混合値の配列があります:
$array=['foo',NULL,'bar',0,false,null,'0',''];
ヌル値は、大文字/小文字に関係なく削除されます。
しかし、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);