PHPでは、 array_filter()は、配列内の要素をフィルタリングするために使用できる非常に一般的な関数です。この関数は、配列とコールバック関数(コールバック関数がない場合、デフォルトのブール変換が使用されます)を受け入れ、条件を満たす要素のみを含む新しい配列を返します。 Array_filter()は、単純な1次元配列を扱うときに非常に効果的ですが、ネストされた配列を処理すると、場違いのようです。それでは、なぜarray_filter()フィルターネストされた配列をフィルターできないのですか?この問題をどのように解決できますか?以下で詳しく説明しましょう。
array_filter()の当初の意図は、1次元配列をフィルタリングすることです。アレイのサブアレイを再帰的に処理するわけではありません。つまり、 array_filter()は、アレイのトップレベル要素にコールバック関数のみを適用し、ネストされた配列の要素を完全に無視します。したがって、配列にネストされた配列が含まれている場合、 array_filter()はこれらのネストされた配列の要素を効果的にフィルタリングできません。
例えば:
$array = [
1,
2,
[3, 4],
5,
[6, 7]
];
$result = array_filter($array, function($value) {
return $value > 3;
});
print_r($result);
出力は次のとおりです。
Array
(
[1] => 2
[3] => Array
(
[0] => 3
[1] => 4
)
[4] => Array
(
[0] => 6
[1] => 7
)
)
ご覧のとおり、ネストされたアレイ[3、4]および[6、7]はフィルタリングされていませんが、結果に保持されます。これは、 array_filter()がネストされた配列を再帰的に入力しないためです。
ネストされたアレイをフィルタリングする最も簡単なソリューションは、再帰を使用することです。 array_filter()を再帰的に呼び出すことにより、ネストされた配列内のすべての要素を処理できるようにします。
再帰フィルタリングの実装は次のとおりです。
function array_filter_recursive($array, $callback) {
return array_map(function($value) use ($callback) {
if (is_array($value)) {
return array_filter_recursive($value, $callback); // ネストされたアレイを再帰的に呼びます
} else {
return $callback($value) ? $value : null; // 個々の要素をフィルタリングします
}
}, $array);
}
$array = [
1,
2,
[3, 4],
5,
[6, 7]
];
$result = array_filter_recursive($array, function($value) {
return $value > 3;
});
print_r($result);
出力の結果は次のとおりです。
Array
(
[1] =>
[2] => Array
(
[1] => 4
)
[3] =>
[4] => Array
(
[0] => 6
[1] => 7
)
)
ご覧のとおり、配列内の各要素がフィルタリングされ、ネストされた配列内の要素が正しくフィルタリングされます。
array_filter_recursive()は、 array_map()を使用してarrayを再帰的に横断し、各要素について、それがarrayであるかどうかを確認します。 arrayの場合、 array_filter_recursive()が再帰的に適用されます。単一の値の場合、コールバック関数がフィルターに適用されます。
この実装では、ヌル値がフィルタリングされます。実際のニーズに応じてコールバック関数の動作を調整し、フィルタリングされた要素を処理する方法を決定できます。
array_filter()自体は、1次元配列のみをフィルタリングでき、ネストされた配列を処理できません。 array_filter()または同様のカスタム関数を再帰的に呼び出すことにより、ネストされた配列の効率的なフィルタリングを簡単に実行できます。ニーズに応じて、コールバック関数のロジックを変更して、柔軟性を高め、さまざまなシナリオに適応させることもできます。
関連タグ:
array_filter