классифицировать массив и получить первое и последнее значение на основе его группы и порядка

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

Демонстрация на 3v4l.org

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

1. это безумие !! спасибо, кстати, и с новым годом