Tenga cuidado con los algoritmos de búsqueda lineal (los anteriores son lineales) en matrices multidimensionales, ya que han agravado la complejidad ya que su profundidad aumenta el número de iteraciones necesarias para atravesar toda la matriz. P.ej:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
tomaría como máximo 200 iteraciones para encontrar lo que está buscando (si la aguja estuviera en [100] [1]), con un algoritmo adecuado.
Los algoritmos lineales en este caso funcionan en O (n) (ordenar el número total de elementos en toda la matriz), esto es pobre, un millón de entradas (por ejemplo, una matriz de 1000x100x10) tomaría en promedio 500,000 iteraciones para encontrar la aguja. Además, ¿qué pasaría si decidiera cambiar la estructura de su matriz multidimensional? Y PHP lanzaría un algoritmo recursivo si su profundidad fuera más de 100. La informática puede mejorar:
Siempre que sea posible, use siempre objetos en lugar de matrices multidimensionales:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
y aplique una interfaz y función de comparación personalizadas para ordenarlas y encontrarlas:
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);
}
Puede uasort()
utilizar un comparador personalizado; si se siente aventurero, debe implementar sus propias colecciones para sus objetos que puedan ordenarlos y administrarlos (siempre extiendo ArrayObject para incluir una función de búsqueda como mínimo).
$arrayObj->uasort("myComp");
Una vez que se ordenan (uasort es O (n log n), que es tan bueno como se supera a los datos arbitrarios), la búsqueda binaria puede hacer la operación en tiempo O (log n), es decir, un millón de entradas solo requieren ~ 20 iteraciones para buscar. Que yo sepa, la búsqueda binaria de comparación personalizada no está implementada en PHP (array_search()
usa un orden natural que funciona en referencias de objetos, no en sus propiedades), tendría que implementar esto usted mismo como lo hago yo.
Este enfoque es más eficiente (ya no hay profundidad) y lo más importante es universal (suponiendo que imponga la comparabilidad usando interfaces) ya que los objetos definen cómo se ordenan, por lo que puede reciclar el código infinitamente. Mucho mejor =)
$key
no existe en la matriz? ¿No sería mejor hacerloif (array_key_exists($key, $array) && $array[$key] == $value) {
?