私はこのような配列を持っています:
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(condition){ //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("/regex/", $array);
_
配列のフィルタリングに使用される多くの一般的な条件があり、そのすべてを配列の値またはキーに適用できます。そのうちのいくつかをここにリストします。
_//Odd values
return $value & 1;
//Even values
return !($value & 1);
//NOT null values
return !is_null($value);
//NOT 0 values
return $value !== 0;
//Contain certain value values
return strpos($value, $needle) !== FALSE; //Use 'use($needle)' to get the var into scope
//Contain certain substring at position values
return substr($value, $position, $length) === $subString;
//NOT 'empty'(link) values
array_filter($array); //Leave out the callback parameter
_
キーのコピーを繰り返し処理して、ループでunset()
を使用できます。
foreach (array_keys($array) as $key) {
if ($array[$key] != 2) {
unset($array[$key]);
}
}
この方法の利点は、配列に大きな値が含まれている場合のメモリ効率です-それらは複製されません。
[〜#〜] edit [〜#〜]気付いたのは、実際には値が2のキーのみが必要であるということです(すでに値を知っています)。
$keys = array();
foreach ($array as $key => $value) {
if ($value == 2) {
$keys[] = $key;
}
}
これは機能するはずですが、おそらく大量のデータをコピーすることになってしまうため、どれほど効率的かはわかりません。
$newArray = array_intersect_key(
$fullarray,
array_flip(array_keys($fullarray, 2))
);
最も簡単で読みやすい組み込み関数は 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,
)
_
2番目のパラメーターが配列として宣言されていることを確認してください。これは期待される値の型であるためです。
これで、foreachループを記述すること、またはarray_filter()
を使用することに何も問題はありません。それらはより冗長な構文を持っています。
array_intersect()
は、2番目のパラメーター配列にさらに値を追加することにより、非常に簡単に拡張(追加の「修飾」値を含む)することもできます。
foreach ($aray as $key => $value) {
if (2 != $value) {
unset($array($key));
}
}
echo 'Items in array:' . count($array);