Php швидка перевірка наявності значення в великому масиві

Постійно зустрічається завдання перевірки наявності значення в масиві. У PHP для цих цілей часто використовують функцію in_array яка приймає два аргументи: шукане значення (або масив значень) і масив, в якому буде проведений пошук. Якщо значення знайдено, функція повертає true. в іншому випадку false.

Опис проблеми

Поки значень в масиві трохи, то все працює швидко. Але як тільки масив розростається до 10 000 - 20 000 елементів, починаються проблеми.

Один мій скрипт повинен був перевіряти елементи на унікальність, зробити це засобами БД не виходило, тому що масив після запиту до бази модифікувався пару раз. У масиві зберігалися тільки числові id елементів (це стане в нагоді для вирішення). У якийсь момент елементів стало понад 60 000 і скрипт став працювати по 20-30 с. на локальному хості, що вкрай повільно.

Простим виміром часу виконання ділянок коду (за допомогою функції microtime ()) що проблема саме в in_array.

Рішення проблеми

Якщо подумати, то перебирати весь масив кожен раз щоб перевірити існування в ньому елемента нерозумно. Набагато простіше перевірити існування конкретного елемента масиву, без перебору інших значень. Для цього замість масиву виду ключ => значення (ID елемента) потрібно використовувати масив виду ключ (ID елемента) => якесь значення (наприклад true).

У такому випадку для перевірки існування елемента в масиві досить використовувати функцію isset (). в яку слід передавати змінну виду $ імя_массіва [шуканий ID елемента].

Після переходу на такий спосіб перевірки скрипт став відпрацьовувати за 1.2 с, що цілком нормально.

Щиро Ваш К.О. =)

Схожі статті