array_filter()した後、どのように私は0から始まる番号順に行くために、キーをリセットすることができます
質問
I配列から「値のみ」を持っていたエントリを削除するだけで使用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())
方法貼り付け/コピーしているどのように多くのプログラマ心配 - 私は、多くのプログラマは、無意識のうちにあるためarray_filterの貪欲の問題に走ったか疑問。それとも悪いことに、どのように多くの人々の関数は、配列からあまりにも多くの値を消去することを発見したことがない...
私は配列からNULL
要素を除去し、キーを再インデックスの2つのプロセスのためのより良い代替手段を提示する。
しかし、まず、私がarray_filter()
の貪欲な性質を強調し、どのようにこれは黙ってプロジェクトをモンキーレンチできることが非常に重要です。ここでは、トラブルを公開しますその中の混合値を持つ配列です。
$array=['foo',NULL,'bar',0,false,null,'0',''];
ヌル値にかかわらず、大文字/小文字の削除されます。
しかし、私たちは array_values()を使用し、配列に残っているものを見& array_filter()の
array_values(array_filter($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
}
}
);
出力配列($フィルタ):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
あなたが再インデックス化キー、非ヌル値のすべて、ヌル値のどれを取得する私の方法で。ご使用のアレイヌルフィルタリングニーズのすべてのためにきれいな、ポータブル、信頼性の高いワンライナー。ここでデモである。
<時間> <時間>同様に、あなたは空、偽、およびヌル要素(保持ゼロ)を削除したい場合は、これらの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);