#php #arrays
#php #массивы
Вопрос:
у меня есть ответ json, который я декодирую :
$myJSON = '[
{"group": "a", "num":1 },
{"group": "a", "num":2 },
{"group": "a", "num":3 },
{"group": "b", "num":4 },
{"group": "b", "num":5 },
{"group": "c", "num":6 },
{"group": "d", "num":7 },
{"group": "-", "num":8 },
{"group": "d", "num":9 },
{"group": "d", "num":10 }
]';
$data = (json_decode($myJSON));
я хочу, чтобы вывод возвращал только первый массив и последний массив, сгруппированные по его значению, что-то вроде :
{
"a": [
{
"first": 1,
"last": 3,
"first_blank": "",
"last_blank": ""
}
],
"b": [
{
"first": 4,
"last": 5,
"first_blank": "",
"last_blank": ""
}
],
"c": [
{
"first": 6,
"last": 6,
"first_blank": "",
"last_blank": ""
}
],
"d": [
{
"first": 7,
"last": 10,
"first_blank": 8,
"last_blank": 8
}
]
}
я попробовал метод уменьшения массива, чтобы классифицировать его группу, а затем метод reset () для получения первого массива, метод end () для получения последнего массива, но его вывод не похож на то, что я хочу, что меня смутило, так это то, что в группе ‘d’ часть пустого значения
Ответ №1:
Вы можете получить желаемый результат, используя array_reduce
. Функция обратного вызова проверяет group
значение из текущего объекта и, если буква отличается, создает новую группу в выходных данных; в противном случае, пока group
это не -
так, она обновляет last
значение текущей группы. Если group
значение равно -
, то first_blank
и last_blank
обновляются по мере необходимости:
$result = array_reduce($data, function ($c, $v) {
$group = $v->group;
$num = $v->num;
if ($group == '-') {
// blank value
$keys = array_keys($c);
$currentgroup = end($keys);
if ($c[$currentgroup]['first_blank'] == '') {
$c[$currentgroup]['first_blank'] = $num;
}
$c[$currentgroup]['last_blank'] = $num;
}
else {
if (!isset($c[$group])) {
$c[$group] = array('first' => $num, 'last' => $num, 'first_blank' => '', 'last_blank' => '');
}
else {
$c[$group]['last'] = $num;
}
}
return $c;
}, []);
echo json_encode($result, JSON_PRETTY_PRINT);
Вывод:
{
"a": {
"first": 1,
"last": 3,
"first_blank": "",
"last_blank": ""
},
"b": {
"first": 4,
"last": 5,
"first_blank": "",
"last_blank": ""
},
"c": {
"first": 6,
"last": 6,
"first_blank": "",
"last_blank": ""
},
"d": {
"first": 7,
"last": 10,
"first_blank": 8,
"last_blank": 8
}
}
Комментарии:
1. это безумие !! спасибо, кстати, и с новым годом