#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.