Большой цикл с проблемами производительности - PullRequest
0 голосов
/ 13 октября 2019

У меня есть два больших массива, второй из которых зависит от первого.

Категории, около 40 строк, Элементы по 40 000 для каждой категории.

  1. Мне нужнопросмотреть каждую категорию - получить объект категории.
  2. Получить из базы данных Элементы для категории.
  3. Сравнить элементы, если есть общие значения определенного атрибута

с использованием PHP 7.1 I'хочу получить решение O (n) ^ n, если это возможно.


private function removeOverlap()
{
    $categories = $this->getCategories();

    foreach($categories as $category)
    {
        $items = $this->getItems($category);

        foreach($items as $item)
        {
            foreach($items as $sibling)
            {
                if($item === $sibling) continue;

                $this->fixOverlap($item, $sibling)
            }
        }
    }
}

Я ищу повышение производительности, потому что это занимает буквально навсегда.

1 Ответ

0 голосов
/ 13 октября 2019

Ответ на вопрос. Обратите внимание, что 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, поиск будет зачарован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...