配列を条件でフィルタリングする方法
-
19-09-2019 - |
質問
次のような配列があります。
array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)
次に、その配列を何らかの条件でフィルターし、値が 2 に等しい要素のみを保持し、値が 2 ではない要素をすべて削除したいと思います。
したがって、期待される結果の配列は次のようになります。
array("a" => 2, "c" => 2, "f" => 2)
注記:元の配列のキーを保持したいと考えています。
PHP でそれを行うにはどうすればよいでしょうか?組み込み関数はありますか?
解決
$fullarray = array('a'=>2,'b'=>4,'c'=>2,'d'=>5,'e'=>6,'f'=>2);
function filterArray($value){
return ($value == 2);
}
$filteredArray = array_filter($fullArray, 'filterArray');
foreach($filteredArray as $k => $v){
echo "$k = $v";
}
他のヒント
何らかの方法で配列をループし、条件によって各要素をフィルタリングする必要があります。これはさまざまな方法で実行できます。
ループ while
/ for
/ foreach
方法
任意のループを使用して配列をループします。 while
, for
または foreach
. 。次に、自分の状態を確認して、次のいずれかを行ってください。 unset()
条件を満たさない場合は要素を書き込むか、条件を満たす要素を新しい配列に書き込みます。
ループ
//while loop
while(list($key, $value) = each($array)){
//condition
}
//for loop
$keys = array_keys($array);
for($counter = 0, $length = count($array); $counter < $length; $counter++){
$key = $keys[$counter];
$value = $array[$key];
//condition
}
//foreach loop
foreach($array as $key => $value){
//condition
}
状態
コメントが含まれるループに条件を配置するだけです //condition
は。条件は必要なものをチェックするだけで、次のいずれかを実行できます。 unset()
条件を満たさない要素を削除し、配列のインデックスを再作成します。 array_values()
必要に応じて、条件を満たす要素を新しい配列に書き込みます。
//Pseudo code
//Use one of the two ways
if(状態){ //1. Condition fulfilled
$newArray[ ] = $value;
//↑ Put '$key' there, if you want to keep the original keys
//Result array is: $newArray
} else { //2. Condition NOT fulfilled
unset($array[$key]);
//Use array_values() after the loop if you want to reindex the array
//Result array is: $array
}
array_filter()
方法
別の方法は、 array_filter()
組み込み関数。通常、これは単純なループを使用する方法とほぼ同じように機能します。
ただ戻ればいいだけです TRUE
要素を配列内に保持したい場合は、 FALSE
結果の配列から要素を削除する場合。
//Anonymous function
$newArray = array_filter($array, function($value, $key){
//condition
}, ARRAY_FILTER_USE_BOTH);
//Function name passed as string
function filter($value, $key){
//condition
}
$newArray = array_filter($array, "filter", ARRAY_FILTER_USE_BOTH);
//'create_function()', NOT recommended
$newArray = array_filter($array, create_function('$value, $key', '/* condition */'), ARRAY_FILTER_USE_BOTH);
preg_grep()
方法
preg_grep()
と類似しています array_filter()
正規表現を使用して配列をフィルタリングするだけです。したがって、正規表現をフィルターとして使用することしかできず、値によるフィルターか、キーによる追加のコードのみを使用することしかできないため、これを使用してすべてを実行できるわけではありません。
フラグを渡すことができることにも注意してください PREG_GREP_INVERT
結果を反転するための 3 番目のパラメーターとして使用します。
//Filter by values
$newArray = preg_grep("/正規表現/", $array);
共通条件
配列をフィルタリングするために使用される一般的な条件が多数あり、そのすべてを配列の値またはキーに適用できます。ここではそのうちのいくつかを列挙します。
//奇数の値
return $value & 1;
//偶数の値
return !($value & 1);
//NULL 値ではありません
return !is_null($value);
//0 ではない値
return $value !== 0;
//特定の値を含む
return strpos($value, $needle) !== FALSE; //Use 'use($needle)' to get the var into scope
//位置値に特定の部分文字列が含まれています
return substr($value, $position, $length) === $subString;
//ない 「空」(リンク) 価値観
array_filter($array); //Leave out the callback parameter
あなたは、ループ内でunset()
を使用できるようにキーのコピーに繰り返すことができます:
foreach (array_keys($array) as $key) {
if ($array[$key] != 2) {
unset($array[$key]);
}
}
あなたの配列は大きな値が含まれている場合は、この方法の利点は、メモリ効率である - それらは複製されません。
。編集私はちょうどあなたが実際には2(すでに値を知っている)の値を持つキーが必要であること、気づいます:
$keys = array();
foreach ($array as $key => $value) {
if ($value == 2) {
$keys[] = $key;
}
}
これは動作するはずですが、私はあなたがおそらく大量のデータをコピーし終わると、それがどのように効率的ではわからない。
$newArray = array_intersect_key(
$fullarray,
array_flip(array_keys($fullarray, 2))
);
私はsnappiest、読み込み可能な組み込み関数があると思う: array_intersect() の
コード:(デモする)
$array = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
var_export(array_intersect($array, [2]));
出力:
array (
'a' => 2,
'c' => 2,
'f' => 2,
)
ただ、それは期待値型であるので、あなたが配列として第二のパラメータを宣言することを確認します。
さて、foreachループを書き出す、またはarray_filter()
を使用しては何も問題はありません、彼らはちょうどより多くの詳細な構文を持っています。
array_intersect()
は、第2のパラメータ配列に複数の値を加算することによって(追加の「適格」値を含む)に拡張することも非常に容易である。
foreach ($aray as $key => $value) {
if (2 != $value) {
unset($array($key));
}
}
echo 'Items in array:' . count($array);
私のような何かをするかもしれません
$newarray = array();
foreach ($jsonarray as $testelement){
if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);