Dans PHP, Array_Filter () est une fonction très pratique pour filtrer les éléments qui remplissent les conditions d'un tableau. Mais lorsque nous sommes confrontés à un (comme des centaines de milliers ou même des millions d'éléments), les problèmes de performance peuvent devenir un facteur qui doit être pris en considération.
Cet article analysera les performances de Array_Filter () lors du traitement des grandes tableaux et explorera certaines stratégies d'optimisation pratiques.
Dans PHP, la syntaxe de base de Array_Filter () est la suivante:
$result = array_filter($array, function($value) {
return condition;
});
Il fonctionne en appelant la fonction de rappel une fois sur chaque élément du tableau et en gardant l'élément qui revient vrai .
Cela signifie que sa complexité temporelle est O (n) , où n est le nombre d'éléments de tableau.
Lorsque vous traitez avec de grands tableaux, les goulots d'étranglement des performances peuvent provenir des aspects suivants:
La complexité de la fonction de rappel elle-même : si votre logique de rappel est très complexe, elle doublera la consommation de performances.
Utilisation de la mémoire : array_filter () crée un nouveau tableau, et le tableau d'origine est toujours conservé en mémoire, il peut donc manger beaucoup de mémoire lors du traitement des mégadonnées.
Au-dessus des fonctions anonymes : bien que les fonctions anonymes soient très syntaxiquement élégantes, dans des scénarios à haute performance, leur frais général d'appel peut être légèrement supérieur à celui des fonctions ordinaires.
$largeArray = range(1, 1000000);
$filtered = array_filter($largeArray, function($value) {
return $value % 2 === 0;
});
Bien que les conditions de cet exemple soient très simples, dans les projets réels, les fonctions de rappel sont généralement plus complexes et l'efficacité d'exécution sera considérablement réduite.
Si vous avez seulement besoin d'effectuer des opérations de filtrage simples, vous pouvez utiliser ForEach pour remplacer Array_Filter () et éviter les frais généraux supplémentaires causés par les fonctions de rappel:
$filtered = [];
foreach ($largeArray as $value) {
if ($value % 2 === 0) {
$filtered[] = $value;
}
}
Dans la plupart des cas, cette méthode est plus efficace que Array_Filter () .
Les frais généraux des fermetures sont légèrement élevés. Si vous appelez fréquemment, vous pouvez écrire la logique dans une fonction nommée:
function isEven($value) {
return $value % 2 === 0;
}
$filtered = array_filter($largeArray, 'isEven');
Si le tableau est très important, il est recommandé de le traiter par lots pour éviter de consommer une grande quantité de mémoire en même temps:
$chunks = array_chunk($largeArray, 10000);
$filtered = [];
foreach ($chunks as $chunk) {
$filtered = array_merge($filtered, array_filter($chunk, 'isEven'));
}
Parfois, nous pouvons effectuer un filtrage préliminaire à la source des données, comme l'ajout de conditions de filtrage lors de la demande de la base de données ou de l'interface pour éviter de traiter les données inutiles à la couche PHP.
Par exemple:
// Mauvaise façon:Enveloppez d'abord toutes les données, puis filtrez-les
$data = file_get_contents('https://m66.net/api/data');
$decoded = json_decode($data, true);
$filtered = array_filter($decoded, 'isEven');
// Une meilleure approche:API 参数中加入筛选condition
$data = file_get_contents('https://m66.net/api/data?filter=even');
$filtered = json_decode($data, true);
Si vous n'avez pas besoin de renvoyer toutes les données à la fois, vous pouvez utiliser le générateur pour le charger paresseusement:
function filterEven($array) {
foreach ($array as $value) {
if ($value % 2 === 0) {
yield $value;
}
}
}
foreach (filterEven($largeArray) as $even) {
// Traitement en temps réel $even
}
Le générateur ne stocke pas tous les résultats en mémoire, mais renvoie une valeur correspondante à la fois, ce qui est très économe en ressources.
Bien que Array_Filter () soit très syntaxe-concise et convient à la plupart des tableaux de taille petite et moyenne, il existe en effet certains risques de performance lorsqu'ils traitent de grands tableaux. Les performances peuvent être considérablement améliorées en utilisant la substitution FOREAK , en optimisant la logique de rappel, un traitement par lots ou en utilisant des générateurs.
Dans les projets sensibles à la performance, le choix de la façon la plus appropriée de filtrer les données est la clé de l'optimisation du code.