@vechnokrainii
ну почти всегда(

Как вытащить значения из многомерного массива без двух foreach?

Здравствуйте! У меня такая проблема. У меня есть два массива с товаром($deals) и с рекламой ($ads)
$deals
array( 
    [0] => array(
        'id' => 111
        'price' => 500
     )
    [1] => array(
        'id' => 222
        'price' => 500
// и так далее

$ads
array(
    [0] => array(
         'id' => 101010
         'idDeal' => 111
        'dateStop' => 10.11.20
    )
    [1] => array(
         'id' => 202020
         'idDeal' => 111
        'dateStop' => 10.09.20
    )
    [2] => array(
         'id' => 303030
         'idDeal' => 222
        'dateStop' => 10.05.20
    )
// и так далее

Как видно из примера у меня есть массив со всеми товарами и массив историей публикации этих товаров. Полей гораздо больше но я вывел только те которые нужны. В массивы связаны по полям id и idDeal.
Проблема в том что мне нужно получить итоговую таблицу, где будут все товары и в одном из столбоц будет указана дата окончания публикации. Если товар ушел из рекламы то в таблице долдны быть последния запись когда товар публиковался. В одном товаре стоит дата 15.11.20 и сотрудник видит что товар находится в рекламе, а в другом товаре стоит 5.10.20 значит товар последний раз был в рекламе пятого октября. Проблема в том что в массиве $ads хранятся вся история публикаций по тем товарам которые в массиве $deals. И записей может быть много, а нужно брать только последнюю.
Пытался через два foreach ну так как все 15000 товаров и по каждому может быть до 10 записей. То очень долго отрабатывает.
В итоге нужно получить массив $deal c указаной датой последней публикации
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@vdem
Конечно, как написали выше, нужно постараться решить вопрос на уровне запроса к БД. Но вот так тоже будет работать, и притом довольно шустро. Один момент: дату, вероятно, следует перевести в формат здорового человека (год-месяц-день).
$dealsMap = array_combine(array_column($deals, 'id'), $deals);
print_r($dealsMap);
foreach ($ads as $ad) {
    $idDeal = $ad['idDeal'];
    if (!isset($dealsMap[$idDeal]['dateStop'])
            || ($dealsMap[$idDeal]['dateStop'] < $ad['dateStop'])) {
        $dealsMap[$idDeal]['dateStop'] = $ad['dateStop'];
    }
}

print_r($dealsMap);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Poznakomlus
@Poznakomlus
Программист: php, js, go
эти данные вы получаете из базы данных
так вот на уровне запроса базы данных получайте только последние нужные вам данные
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
Сбер Москва
До 240 000 ₽
RecruitIT Москва
от 120 000 до 150 000 ₽
27 окт. 2020, в 14:47
1000 руб./в час
27 окт. 2020, в 14:37
10000 руб./за проект