Ответ на вопрос. Обратите внимание, что foreach
перебирает все записи каждый раз. Вы должны сбросить записи, которые вы уже проанализировали.
foreach($items as $key => $item)
{
foreach($items as $sibling)
{
if($item === $sibling) continue;
$this->fixOverlap($item, $sibling); // not sure what this method does.
}
unset($items[$key]); // unset keys which were previously parsed
}
Я не уверен, что вы собираетесь использовать в своем коде, но в случае, если это просто поиск элементов на наличие дубликатов, я быиспользуйте array_unique()
: http://php.net/array_unique
$filtered = array_unique($items);
Хорошая практика. Использование PHP займет всю жизнь. Не только потому, что это требует большого потребления ЦП, но и потому, что серверу MySQL требуется время, чтобы вернуть все categories * 40k
записи.
Я считаю, что вы должны вместо этого использовать оптимизированные запросы SQL. Базы данных выполняют эти задачи намного быстрее, чем сам PHP. Вот демонстрация:
SELECT DISTINCT * FROM items WHERE items.category = 'category1';
Это автоматически вернет все отдельные записи из базы данных для category1
. Если вы используете индексы для таблицы items
, поиск будет зачарован.