За последние 24 часа нас посетили 22560 программистов и 1276 роботов. Сейчас ищут 714 программистов ...

Работа с большим количеством данных в многомерном массиве

Тема в разделе "PHP для новичков", создана пользователем Pavel_Sheme, 8 окт 2021.

  1. Pavel_Sheme

    Pavel_Sheme Новичок

    С нами с:
    1 окт 2021
    Сообщения:
    8
    Симпатии:
    0
    Приветствую, имеется следующий код
    PHP:
    1. foreach($dostup_yaht as $v) {
    2.         $yacht_cursor = $collection_yachts->findOne(['id'=>$v->yachtId]);
    3.         $base_cursor = $collection_bases->findOne(['id'=>$v->startBaseId]);
    4.         $yacht_img = $yacht_cursor['images'];
    5.         if($yacht_cursor) {
    6.             if($v->price > 0 && $yacht_cursor->length > 0 && $yacht_cursor->year > 0) {
    7.      
    8.     $yacht_dostup_id[] = [
    9.         'yachtId' => $v->yachtId,
    10.         'name' => $v->yacht,
    11.         'city' => $base_cursor->city,
    12.         'country' => $base_cursor->country,
    13.         'year' => $yacht_cursor->year,
    14.         'mainimage' =>  GetImageMain($yacht_img),
    15.         'model' => $yacht_cursor->model,
    16.         'cabins' => $yacht_cursor->cabins,
    17.         'kind' => $yacht_cursor->kind,
    18.         'wc' => $yacht_cursor->wc,
    19.         'berths' => $yacht_cursor->berths,
    20.         'mainsailType' => $yacht_cursor->mainsailType,
    21.         'proizvod' => $yacht_cursor->shipyardId,
    22.         'length' => $yacht_cursor->length,
    23.         'startBase' => $v->startBase,
    24.         'endBase' => $v->endBase,
    25.         'price' => $v->price,
    26.         'startPrice' => $v->startPrice,
    27.         'equipmentIds' => $yacht_cursor['equipmentIds'],
    28.         'discountPercentage' => $v->discountPercentage,
    29.         'ball' => abs($v->price / $yacht_cursor->length / ($yacht_cursor->year - 2023))
    30.         ];
    31.        
    32.     }
    33. }
    34. }
    В $dostup_yaht получаю информацию о доступности из апи, перебираю его, и создаю многомерный массив в который подставляю значения, которые уже берутся непосредственно из БД, данное решение рабочее, но очень долгое, так как в $dostup_yaht получаю 5к элементов.
    Время выполнения данного блока 18-20 секунд на пк на легеньком хостинге 40-50 сек.
    Нужна подсказка, как ускорить данный участок кода, сделать его, как можно быстрее, если у кого то есть примеры с подобными работами, буду рад посмотреть, ну или же жду советов, как можно реализовать это
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    жуть, а не имена

    по теме..... а зачем вам сразу все 5к записей? Обычно делают пагинацию, слыхали про такое?

    опять же, может проще получить из апи данные о доступности - и на основе этих данных делать запрос к БД, а не перебирать ВСЮ бд? То есть получили массив ид яхт, в запросе указали WHERe IN(тут полученные ид)

    ну и как всегда скажу - что запросы внутри цикла - зло )))
     
  3. Pavel_Sheme

    Pavel_Sheme Новичок

    С нами с:
    1 окт 2021
    Сообщения:
    8
    Симпатии:
    0
    Конкретно на вывод пагинация конечно же стоит, по 50 записей,
    По варианта получения данных о доступности из апи, и обращаться исходя из ответа в БД, вариант хороший, работающий, но проблема в том, что доступность возвращает не только перечень доступных яхт, но еще и цены, базы и ТД, в дальнейшем получается, что сортировка по ценам не возможна, а так же по тем параметрам, что возвращает доступность
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    1) может в кроне тогда просто обновлять значения в текущей бд, а потом делать нормальную быструю выборку из бд, с пагинацией? и не только на вывод, но и на запрос...
    2) настолько ли плохо апи, что не позволяет указывать условия, которые вам нужны, а отдает прямо просто весь список?
     
  5. Pavel_Sheme

    Pavel_Sheme Новичок

    С нами с:
    1 окт 2021
    Сообщения:
    8
    Симпатии:
    0
    Обновлять значения тоже не вариант, так как доступность и цены возвращается непосредственно по указанной дате пользователем, данные всегда разные
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    апи не поддерживает выборки по нужным вам параметрам?

    findOne - это запрос к БД?
     
  7. Pavel_Sheme

    Pavel_Sheme Новичок

    С нами с:
    1 окт 2021
    Сообщения:
    8
    Симпатии:
    0
    findOne запрос к БД, использую mongodb
    Апи поддерживает выборку по нужным параметрам, но возможности отсортировать например по цене от самой низкой к высокой нету
    --- Добавлено ---
    Ну и конечно же не по всем нужным параметрам апи позволяет делать выборку
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    ну все равно, я склоняюсь больше к варианту - выкачать все данные, за все даты обозримые в локальную БД
    не думаю что цены и другие данные, кроме доступности сильно меняются например в течении дня.... обновлять ночью например
    из апи получать только ид доступных яхт и условий - что может реализовать апи, потом эти данные в запрос подставлять - а сами данные брать из локальной БД, по феншую, с сортировками, доп выборками, пагинацией
     
  9. Pavel_Sheme

    Pavel_Sheme Новичок

    С нами с:
    1 окт 2021
    Сообщения:
    8
    Симпатии:
    0
    Хмм, попробую, идея мне нравится