Tenha cuidado com os algoritmos de pesquisa linear (os acima são lineares) em matrizes multidimensionais, pois elas aumentam a complexidade, pois sua profundidade aumenta o número de iterações necessárias para percorrer toda a matriz. Por exemplo:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
seriam necessárias no máximo 200 iterações para encontrar o que você estava procurando (se a agulha estivesse em [100] [1]), com um algoritmo adequado.
Os algoritmos lineares, neste caso, são executados em O (n) (número total de elementos da ordem em todo o array); isso é ruim; um milhão de entradas (por exemplo, um array de 1000x100x10) levaria em média 500.000 iterações para encontrar a agulha. Além disso, o que aconteceria se você decidisse alterar a estrutura de sua matriz multidimensional? E o PHP lançaria um algoritmo recursivo se sua profundidade fosse superior a 100. A ciência da computação pode fazer melhor:
Sempre que possível, sempre use objetos em vez de várias matrizes dimensionais:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
e aplique uma interface e função comparadora personalizada para classificá-las e localizá-las:
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);
}
Você pode usar uasort()
para utilizar um comparador personalizado; se estiver se aventurando, deve implementar suas próprias coleções para seus objetos que podem classificá-los e gerenciá-los (eu sempre estendo o ArrayObject para incluir no mínimo uma função de pesquisa).
$arrayObj->uasort("myComp");
Depois de ordenadas (uasort é O (n log n), o que é tão bom quanto obtém dados arbitrários), a pesquisa binária pode fazer a operação em O (log n), ou seja, um milhão de entradas leva apenas 20 iterações para procurar. Tanto quanto sei, a pesquisa binária do comparador personalizado não está implementada no PHP (array_search()
usa ordenação natural que funciona em referências a objetos e não em suas propriedades), você teria que implementar isso como você.
Essa abordagem é mais eficiente (não existe mais profundidade) e, mais importante, universal (supondo que você imponha comparabilidade usando interfaces), pois os objetos definem como eles são classificados, para que você possa reciclar o código infinitamente. Muito melhor =)
$key
ele não existir na matriz? Não seria melhor fazerif (array_key_exists($key, $array) && $array[$key] == $value) {
?