Dans PHP, Array_Filter () est une fonction très courante qui peut être utilisée pour filtrer les éléments dans un tableau. Cette fonction accepte un tableau et une fonction de rappel (la transformation booléenne par défaut est utilisée s'il n'y a pas de rappel) et renvoie un nouveau tableau contenant uniquement des éléments qui remplissent les conditions. Bien que Array_Filter () soit très efficace lorsque vous traitez avec de simples tableaux unidimensionnels, il semble déplacé lorsque nous traitons des tableaux imbriqués. Alors, pourquoi ne peut-il pas filtrer les tableaux imbriqués de filtre ? Comment pouvons-nous résoudre ce problème? Discutons en profondeur ci-dessous.
L'intention d'origine de Array_Filter () est de filtrer les tableaux unidimensionnels. Il ne traite pas de manière récursive les sous-réseaux d'un tableau. Autrement dit, Array_Filter () n'appliquera qu'une fonction de rappel aux éléments de niveau supérieur du tableau et ignore complètement les éléments du tableau imbriqué. Par conséquent, si un tableau contient des tableaux imbriqués, Array_Filter () ne peut pas filtrer efficacement les éléments de ces tableaux imbriqués.
Par exemple:
$array = [
1,
2,
[3, 4],
5,
[6, 7]
];
$result = array_filter($array, function($value) {
return $value > 3;
});
print_r($result);
La sortie sera:
Array
(
[1] => 2
[3] => Array
(
[0] => 3
[1] => 4
)
[4] => Array
(
[0] => 6
[1] => 7
)
)
Comme vous pouvez le voir, les tableaux imbriqués [3, 4] et [6, 7] ne sont pas filtrés, mais sont conservés dans le résultat tel quel. En effet, array_filter () n'entre pas récursivement dans le tableau imbriqué.
La solution la plus simple pour filtrer les tableaux imbriqués est d'utiliser la récursivité. En appelant Array_Filter () récursivement, nous pouvons nous assurer que chaque élément du tableau imbriqué peut être traité.
Voici une implémentation du filtrage récursif:
function array_filter_recursive($array, $callback) {
return array_map(function($value) use ($callback) {
if (is_array($value)) {
return array_filter_recursive($value, $callback); // Appelez récursivement à des tableaux imbriqués
} else {
return $callback($value) ? $value : null; // Filtrez des éléments individuels
}
}, $array);
}
$array = [
1,
2,
[3, 4],
5,
[6, 7]
];
$result = array_filter_recursive($array, function($value) {
return $value > 3;
});
print_r($result);
Le résultat de la sortie sera:
Array
(
[1] =>
[2] => Array
(
[1] => 4
)
[3] =>
[4] => Array
(
[0] => 6
[1] => 7
)
)
Comme vous pouvez le voir, chaque élément du tableau est filtré et les éléments du réseau imbriqué sont filtrés correctement.
array_filter_recursive () traverse récursivement le tableau à l'aide de array_map () , pour chaque élément, vérifiez s'il s'agit d'un tableau. S'il s'agit d'un tableau, array_filter_recursive () est appliqué récursivement. S'il s'agit d'une seule valeur, la fonction de rappel est appliquée au filtre.
Dans cette implémentation, la valeur nul est filtrée. Vous pouvez ajuster le comportement de la fonction de rappel en fonction des besoins réels et décider comment gérer les éléments filtrés.
Array_Filter () lui-même ne peut filtrer que les tableaux unidimensionnels et ne peut pas gérer les tableaux imbriqués. En appelant récursivement Array_Filter () ou des fonctions personnalisées similaires, nous pouvons facilement effectuer un filtrage efficace des tableaux imbriqués. Selon vos besoins, vous pouvez également modifier la logique de la fonction de rappel pour la rendre plus flexible et s'adapter à différents scénarios.