Delgus
@Delgus

Как распарсить сложный заголовок?

В заголовке запроса приходит довольно сложное содержание:
X-CALLBACK-ID timestamp=1563105451261; nonce=a07bfa17;value=E4YeOsnMtHZ6592U8B9S37238E+Hwtjfrmpf8AQXF+c=

Я хочу распарсить это в массив
$aaa = [
            'timestamp' =>1563105451261,
            'nonce'     =>'a07bfa17',
            'value'     =>'E4YeOsnMtHZ6592U8B9S37238E+Hwtjfrmpf8AQXF+c=',
        ];

Впринципе написал рабочее решение, но оно как то стремно выглядит
public function handle($request, Closure $next)
    {
        $xHeader = $request->header("X-CALLBACK-ID");
        if (!$xHeader) {
            abort(403);
        }

        $kvPairs = explode(";", $xHeader);

        if (count($kvPairs) != 3) {
            abort(403);
        }

        $parsedHeader = [];

        foreach ($kvPairs as $pair) {
            $pos = strpos($pair, "=");
            if (!$pos) {
                abort(403);
            }

            $parsedHeader[substr($pair, 0, $pos)] = substr($pair, $pos + 1);
        }

        if (!isset($parsedHeader['timestamp'], $parsedHeader['nonce'], $parsedHeader['value'])) {
            abort(403);
        }

Возможно есть какое то более производительное и читабельное решение? Подскажите плиз если знаете как реализовать это лучше?
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 2
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
<?php

$xHeader = 'timestamp=1563105451261; nonce=a07bfa17;value=E4YeOsnMtHZ6592U8B9S37238E+Hwtjfrmpf8AQXF+c=';

preg_match_all('!([^=; ]+)=([^;]+)!si', $xHeader, $out);

$parsedHeader = array_combine($out[1], $out[2]);

print_r($parsedHeader);


результат
Array
(
    [timestamp] => 1563105451261
    [nonce] => a07bfa17
    [value] => E4YeOsnMtHZ6592U8B9S37238E+Hwtjfrmpf8AQXF+c=
)
Ответ написан
@karminski
Senior PHP /React.js developer
Да нормально выглядит. Можно foreach заменить на array_map. Хорошим тоном считается, чтобы функция возвращала значение. Также делать дважды abort(403) тоже не красиво. Но код рабочий, это главное.

Ещё не вижу в коде использование входящего параметра next. Он лишний? Ну и тогда тег вопроса laravel видимо лишний.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы