Je suis vraiment nouveau chez PHP et j'ai besoin d'une suggestion sur la recherche de tableau.
Si je veux rechercher un élément à l'intérieur d'une matrice multidimensionnelle, je peux utiliser Je vois les deux suggestions à de nombreux endroits. Lequel est plus vite? Ci-dessous est un exemple de tableau. P> Je cherche comme ça. P> array_filter je peux faire boucler Le tableau et voir si un élément correspondant à mes critères est présent. P> $thisQuestion = array_filter($pollQuestions, function($q) {
return questionId == $q["id"];
});
5 Réponses :
Array_Filter P>
itère sur chaque valeur dans la matrice d'entrée qui les transmettent à la Fonction de rappel. Si la fonction de rappel renvoie True, le courant La valeur de l'entrée est renvoyée dans la matrice de résultat. Les clés de tableau sont préservé. P> blockQuote>
comme pour moi même. p>
Ce n'est pas ce que OP a demandé.
Je sais, la question est ancienne, mais je suis en désaccord avec la réponse acceptée. Je me demandais également, s'il y avait une différence entre un http://www.levijackson.net/are-array_ -fonctions-Faster-Than-Loops / P>
Levi Jackson a fait un bon travail et a comparé la vitesse de plusieurs boucles et foreach () code> boucle et la fonction array_filter () code> fonction et trouvé le message suivant: p>
array _ * () code> fonctions. Selon lui, un foreach () code> boucle est plus rapide que la fonction array_filter () code>. Bien que cela ne fait généralement pas une telle grande différence, cela commence à la matière, lorsque vous devez traiter beaucoup de données. P>
Est-ce une réponse ou un lien vers une réponse? Si ce dernier, c'est hors sujet.
Merci pour le lien utile!
Je sais que c'est une vieille question, mais je vais donner mes deux centimes: pour moi, en utilisant une boucle foreach était beaucoup plus rapide que d'utiliser Array_Filter. En utilisant 1,4 seconde, il a fallu 1,4 seconde pour effectuer une recherche par ID et utiliser le filtre qu'il a fallu 8,6 secondes. P>
de ma propre expérience, La règle commune est la suivante: tout est plus simple, courir plus vite (implique moins de chèque, moins de fonctionnalité, aussi longtemps que tout ce dont vous avez besoin) P> foreach code> est plus rapide. Je pense que cela a quelque chose à voir avec la fonction d'appels de fonction, vérification des arguments, copier dans l'instruction de retour variable, etc. Lorsque vous utilisez une syntaxe de base, le code analysé est plus susceptible de se rapprocher des byTecodes compilés / interprétés, ont une meilleure optimisation. le noyau. p>
J'ai fait un script de test parce que j'étais un peu sceptique ... Comment une fonction interne peut-elle être plus lente qu'une boucle ...
mais en fait c'est vrai. Un autre résultat intéressant est que PHP 7.4 est presque 10 fois plus rapide que 7,2! P>
Vous pouvez vous essayer P>
<?php
/*** Results on my machine ***
php 7.2
array_filter: 2.5147440433502
foreach: 0.13733291625977
for i: 0.24090600013733
php 7.4
array_filter: 0.057109117507935
foreach: 0.021071910858154
for i: 0.027867078781128
**/
ini_set('memory_limit', '500M');
$data = range(0, 1000000);
// ARRAY FILTER
$start = microtime(true);
$newData = array_filter($data, function ($item) {
return $item % 2;
});
$end = microtime(true);
echo "array_filter: ";
echo $end - $start . PHP_EOL;
// FOREACH
$start = microtime(true);
$newData = array();
foreach ($data as $item) {
if ($item % 2) {
$newData[] = $item;
}
}
$end = microtime(true);
echo "foreach: ";
echo $end - $start . PHP_EOL;
// FOR
$start = microtime(true);
$newData = array();
$numItems = count($data);
for ($i = 0; $i < $numItems; $i++) {
if ($data[$i] % 2) {
$newData[] = $data[$i];
}
}
$end = microtime(true);
echo "for i: ";
echo $end - $start . PHP_EOL;
Cela devrait être la réponse acceptée ces jours-ci.
S'il vous plaît, décrivez exactement ce que vous voulez faire? Des tableaux multidimensionnels?
array_filter () code> ne peut pas les gérer de manière native. Vous recherchez une seule valeur dans un tableau?array_filter () code> n'est pas le meilleur moyen de le faire car vous pouvez arrêter l'itération lorsque vous avez trouvé la valeur que vous recherchiez -array_filter () code> ne fait pas ça . Filtrer un ensemble de valeurs d'un ensemble plus grand? Très probablement quearray_filter () code> est plus rapide qu'unmot codé à la main code> -Loop car il s'agit d'une fonction intégrée.@Stefan Gehrig j'ai ajouté mon tableau d'échantillon et mon code pour Array_Filter. Mon point est que cela soit similaire à faire une boucle ou qu'il peut être plus rapide? Ma taille de maquette maximale est de 30.