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

Osik

Новичок
Приветствую, имеется следующий код
PHP:
PHP:
foreach($dostup_yaht as $v) {
        $yacht_cursor = $collection_yachts->findOne(['id'=>$v->yachtId]);
        $base_cursor = $collection_bases->findOne(['id'=>$v->startBaseId]);
        $yacht_img = $yacht_cursor['images'];
        if($yacht_cursor) {
            if($v->price > 0 && $yacht_cursor->length > 0 && $yacht_cursor->year > 0) {
      
    $yacht_dostup_id[] = [
        'yachtId' => $v->yachtId,
        'name' => $v->yacht,
        'city' => $base_cursor->city,
        'country' => $base_cursor->country,
        'year' => $yacht_cursor->year,
        'mainimage' =>  GetImageMain($yacht_img),
        'model' => $yacht_cursor->model,
        'cabins' => $yacht_cursor->cabins,
        'kind' => $yacht_cursor->kind,
        'wc' => $yacht_cursor->wc,
        'berths' => $yacht_cursor->berths,
        'mainsailType' => $yacht_cursor->mainsailType,
        'proizvod' => $yacht_cursor->shipyardId,
        'length' => $yacht_cursor->length,
        'startBase' => $v->startBase,
        'endBase' => $v->endBase,
        'price' => $v->price,
        'startPrice' => $v->startPrice,
        'equipmentIds' => $yacht_cursor['equipmentIds'],
        'discountPercentage' => $v->discountPercentage,
        'ball' => abs($v->price / $yacht_cursor->length / ($yacht_cursor->year - 2023))
        ];
        
    }
 }
}


В $dostup_yaht получаю информацию о доступности из апи, перебираю его, и создаю многомерный массив в который подставляю значения, которые уже берутся непосредственно из БД, данное решение рабочее, но очень долгое, так как в $dostup_yaht получаю 5к элементов.
Время выполнения данного блока 18-20 секунд на пк на легеньком хостинге 40-50 сек.
Нужна подсказка, как ускорить данный участок кода, сделать его, как можно быстрее, если у кого то есть примеры с подобными работами, буду рад посмотреть, ну или же жду советов, как можно реализовать это
 

Фанат

oncle terrible
Команда форума
Вообще странно. 5к запросов в БД это должно быть ну никак не больше секунды.
Но можно попробовать запросить все записи разом, сохранить в массив и потом уже брать из него.

Но вообще надо профилировать. Смотреть, какие строчки занимают больше всего времени, и оптимизировать их.
Я надеюсь, GetImageMain не занимается изменением размера?
 

WMix

герр M:)ller
Партнер клуба
а если не делать запрос на каждую итерацию, как это у тебя, а махом вытягивать?
чтото типо
PHP:
foreach($dostup_yaht as $v) {
        $yachtId[] = $v->yachtId;
        $startBaseId[] = $v->startBaseId;
}
$yacht_cursor = $collection_yachts->iterator('id' 'IN', $yachtId);
$base_cursor = $collection_bases->iterator('id' 'IN', $startBaseId);
// ...
 

Osik

Новичок
Вообще странно. 5к запросов в БД это должно быть ну никак не больше секунды.
Но можно попробовать запросить все записи разом, сохранить в массив и потом уже брать из него.

Но вообще надо профилировать. Смотреть, какие строчки занимают больше всего времени, и оптимизировать их.
Я надеюсь, GetImageMain не занимается изменением размера?
PHP:
function GetImageMain($array)
{
    $result;
    foreach ($array as $key => $value) {
        if($value->description == 'Main image') {
            $result = $value->url;
        }
    }
    return  print $result;
}
а если не делать запрос на каждую итерацию, как это у тебя, а махом вытягивать?
чтото типо
PHP:
foreach($dostup_yaht as $v) {
        $yachtId[] = $v->yachtId;
        $startBaseId[] = $v->startBaseId;
}
$yacht_cursor = $collection_yachts->iterator('id' 'IN', $yachtId);
$base_cursor = $collection_bases->iterator('id' 'IN', $startBaseId);
// ...
Мне на выходе нужен 1 массив со всеми данными, для дальнейшей сортировки, например в базе нет цен изначально, так как они меняются постоянно в зависимости от даты и разных параметров. По предложенному способу я смогу вывести список из базы, прикрутить к каждой яхте ценник, но не смогу отсортировать эти яхты по цене, например от низкой цены к высокой
 

Фанат

oncle terrible
Команда форума
function GetImageMain($array)
Вы реально из всего моего комментария поняли только последнюю строчку?

не смогу отсортировать эти яхты по цене
Это шутка? Откуда здесь сортировка по цене вылезла? А, главное, как предложенный способ может помешать сортировке, если результат будет ровно такой же?

В общем как всегда - нам показали 10% кода, а остальной опустили как "не имеющий значения".
 
Сверху