Будьте осторожны с алгоритмами линейного поиска (вышеупомянутые являются линейными) в многомерных массивах, поскольку они имеют сложную сложность, поскольку его глубина увеличивает количество итераций, необходимых для обхода всего массива. Например:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
потребуется не более 200 итераций, чтобы найти то, что вы ищете (если стрелка была в [100] [1]), с подходящим алгоритмом.
Линейные алгоритмы в этом случае работают при O (n) (порядок общего числа элементов во всем массиве), это плохо, миллион записей (например, массив 1000x100x10) потребует в среднем 500 000 итераций, чтобы найти стрелку. И что будет, если вы решите изменить структуру многомерного массива? И PHP запускает рекурсивный алгоритм, если ваша глубина превышает 100. Информатика может сделать лучше:
Где возможно, всегда используйте объекты вместо многомерных массивов:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
и примените пользовательский интерфейс и функцию компаратора, чтобы отсортировать и найти их:
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);
}
Вы можете uasort()
использовать собственный компаратор, если вам хочется приключений, вы должны реализовать свои собственные коллекции для своих объектов, которые могут сортировать их и управлять ими (я всегда расширяю ArrayObject, чтобы включить функцию поиска как минимум).
$arrayObj->uasort("myComp");
Как только они отсортированы (uasort равен O (n log n), что так же хорошо, как и по произвольным данным), двоичный поиск может выполнить операцию за O (log n), то есть миллион записей занимает всего ~ 20 итераций, чтобы поиск. Насколько я знаю, пользовательский двоичный поиск компаратора не реализован в PHP ( array_search()
использует естественное упорядочение, которое работает со ссылками на объекты, а не с их свойствами), вам придется реализовать это самостоятельно, как я.
Этот подход более эффективен (больше нет глубины) и, что более важно, универсален (предполагается, что вы применяете сопоставимость с помощью интерфейсов), поскольку объекты определяют способ их сортировки, поэтому вы можете бесконечно перерабатывать код. Гораздо лучше =)
$key
не существует в массиве? Не лучше ли это сделатьif (array_key_exists($key, $array) && $array[$key] == $value) {
?