Будьте уважні до лінійних алгоритмів пошуку (наведені вище є лінійними) у багатовимірних масивах, оскільки вони мають складну складність, оскільки його глибина збільшує кількість ітерацій, необхідних для проходження всього масиву. Наприклад:
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) {
?