Могу ли я получить конкретное значение JSON по идентификатору?

#php #json

Вопрос:

Я хотел бы, чтобы соответствующая дата typeId: 11 выводилась из следующего JSON. Порядок идентификаторов типов всегда разный, поэтому не всегда работает, например, всегда обращаться ко второму значению.

     {
    "page": 1,
    "totalsCount": 1,
    "isLastPage": true,
    "lastPageNumber": 1,
    "firstOnPage": 1,
    "lastOnPage": 1,
    "itemsPerPage": 50,
    "entries": [
        {
            "id": 60132,
            "statusName": "GIT",
            "dates": [
                {
                    "orderId": 60132,
                    "typeId": 7,
                    "date": "2021-06-03T00:00:00 02:00"
                },
                {
                    "orderId": 60132,
                    "typeId": 11,
                    "date": "2021-05-28T00:00:00 02:00"
                },
                {
                    "orderId": 60132,
                    "typeId": 16,
                    "date": "2021-05-27T20:20:28 02:00"
                },
                {
                    "orderId": 60132,
                    "typeId": 2,
                    "date": "2021-05-27T20:19:21 02:00"
                },
                {
                    "orderId": 60132,
                    "typeId": 4,
                    "date": "2021-06-03T15:16:14 02:00"
                }
            ]
        }
    ]
}
 

С моим подходом до сих пор я не получаю никакого результата:

 $json = file_get_contents($orders);
$arr = json_decode($orders);
foreach($arr->entries as $order => $value) {

echo '<th scope="row">' . $value->dates->[typeId='11'].date . '</th>';
}
 

Где здесь моя ошибка?

Комментарии:

1. Вы не можете получить значения из массива или подобного объекта. Вам придется перебирать даты, чтобы найти нужное свойство

2. Что такое стоимость в долларах? Я хотел бы рассмотреть некоторые ранее заданные вопросы о том, как анализировать или перебирать массив JSON.

3. Извините — я добавил информацию к вопросу.

Ответ №1:

Вы могли бы использовать array_map() :

 <?php
$arr = json_decode($json, true);
$result = array_filter(
    array_map(
        function ($record) {if($record['typeId'] == 11) return $record['date'];}, $arr['dates']
    )
);
 

используется array_filter() для удаления пустых значений из результирующего набора.

рабочая демонстрация

Редактировать

С обновленной информацией о json вы можете использовать:

 $obj = json_decode($json);
foreach($obj->entries[0]->dates as $order => $value) {
    if($value->typeId == 11) echo '<th scope="row">' . $value->date . '</th>';
}
 

рабочая демонстрация

Комментарии:

1. Это выглядит хорошо, но на самом деле это не работает для меня.. Мой код: 3v4l.org/AkIcC

2. Спасибо, у тебя все получилось! Но одна маленькая проблема в моем коде: записи [0] показывают мне значение только в первом порядке. Поэтому во втором заказе не указана дата доставки. Можете ли вы показать записи в порядке возрастания по количеству? записи [0], записи [1], записи [2] .. и т.д.?

3. Рад, что это работает! Это отвечает на вопрос «Могу ли я получить конкретное значение JSON по идентификатору?» . Ваш последующий вопрос «показать записи в порядке возрастания по количеству» должен быть опубликован как новый вопрос с вашей лучшей попыткой решить вашу проблему и любые проблемы, с которыми вы столкнулись при решении.

Ответ №2:

Для такого рода ситуаций я обычно пишу простую функцию, подобную этой:

 function getDate(array $dates, $typeId) {
    foreach ($dates as $date) {
        if ($date['typeId'] === $typeId) {
            return $date;
        }
    }
    return null;
}
 

Ответ №3:

Поскольку dates это массив, который вам нужно перебрать и отфильтровать по нужным элементам typeId .

Что-то вроде этого:

dates.filter(({typeId}) => typeId === 11).shift().date

Комментарии:

1. Хорошо… очевидно, что это вопрос, связанный с PHP, и, следовательно, это не ответ на PHP.