Будьте осторожны с алгоритмами линейного поиска (приведенные выше являются линейными) в многомерных массивах, поскольку они имеют сложную сложность, поскольку ее глубина увеличивает количество итераций, необходимых для обхода всего массива. Например:
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()
использует естественное упорядочение, которое работает со ссылками на объекты, а не с их свойствами), вам придется реализовать это самостоятельно, как я.
Этот подход более эффективен (больше нет глубины) и, что более важно, универсален (предполагается, что вы применяете сопоставимость с помощью интерфейсов), поскольку объекты определяют способ их сортировки, поэтому вы можете бесконечно перерабатывать код. Гораздо лучше =)