array_filter を使用して、配列から値 '' のみを持つエントリを削除しましたが、0 から始まるプレースホルダーに応じて特定の変換を適用したいのですが、残念ながら元のインデックスを保持しています。しばらく探しましたが、何も見えませんでした。おそらく、明らかなことを見逃しただけかもしれませんが、私の質問は...
古いインデックスを保持するのではなく、配列のインデックスを 0 から始まり、新しい配列で順番に並べ替えるにはどうすればよいですか?
配列を呼び出すとarray_values
、ゼロから再インデックスされます。
配列フィルターを使用している場合は、次のようにします
$NewArray = array_values(array_filter($OldArray));
使用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
何人のプログラマーが何の罪もなくarray_values(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 値は取得しません。配列の 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);