Faites attention aux algorithmes de recherche linéaire (ceux ci-dessus sont linéaires) dans des tableaux multidimensionnels car ils ont aggravé la complexité car sa profondeur augmente le nombre d'itérations nécessaires pour parcourir le tableau entier. Par exemple:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
prendrait au plus 200 itérations pour trouver ce que vous cherchez (si l'aiguille était à [100] [1]), avec un algorithme approprié.
Les algorithmes linéaires dans ce cas fonctionnent à O (n) (ordre du nombre total d'éléments dans le tableau entier), c'est médiocre, un million d'entrées (par exemple un tableau de 1000x100x10) prendrait en moyenne 500000 itérations pour trouver l'aiguille. Que se passerait-il également si vous décidiez de changer la structure de votre tableau multidimensionnel? Et PHP lancerait un algorithme récursif si votre profondeur était supérieure à 100. L'informatique peut faire mieux:
Dans la mesure du possible, utilisez toujours des objets au lieu de tableaux à plusieurs dimensions:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
et appliquez une interface et une fonction de comparateur personnalisées pour les trier et les trouver:
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
Vous pouvez utiliser uasort()
pour utiliser un comparateur personnalisé, si vous vous sentez aventureux, vous devez implémenter vos propres collections pour vos objets qui peuvent les trier et les gérer (j'étends toujours ArrayObject pour inclure au moins une fonction de recherche).
$arrayObj->uasort("myComp");
Une fois qu'ils sont triés (uasort est O (n log n), ce qui est aussi bon que sur des données arbitraires), la recherche binaire peut effectuer l'opération en temps O (log n), c'est-à-dire qu'un million d'entrées ne prend que ~ 20 itérations pour chercher. Autant que je sache, la recherche binaire de comparateur personnalisé n'est pas implémentée en PHP ( array_search()
utilise un ordre naturel qui fonctionne sur les références d'objet et non sur leurs propriétés), vous devrez l'implémenter vous-même comme je le fais.
Cette approche est plus efficace (il n'y a plus de profondeur) et surtout universelle (en supposant que vous appliquez la comparabilité à l'aide d'interfaces) puisque les objets définissent comment ils sont triés, vous pouvez donc recycler le code à l'infini. Beaucoup mieux =)
$key
ne sortira- t-elle pas si elle n'existe pas dans le tableau? Ne serait-il pas préférable de le faireif (array_key_exists($key, $array) && $array[$key] == $value) {
?