Почему не массив возвращается(как исправить ошибки)

<?php
var_dump(json_decode($_COOKIE['history_lots']));
if (isset($_GET['tab']) and $_GET['tab'] == 'lot' and !in_array($_GET['id_lot'], json_decode($_COOKIE['history_lots']))){
    setcookie('history_lots', json_encode((json_decode($_COOKIE['history_lots']))[] = $_GET['id_lot']), strtotime('next year'), '/');
}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Егор Банин

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

Не используйте суперглобальные массивы как переменные. Не передавайте их в функции, не сравнивайте их. Всегда создавайте переменную, которой присваивайте значение из суперглобального массива и дальше работайте только с этой переменной.

Присваивать удобно с помощью оператора объединения с null:

$tab = $_GET['tab']?? '';
if ($tab === 'lot' ...) {...}

Этот простой приём позволит вам избежать множества глупых ошибок (например, что случится, если кук ещё нет?).

<?php

$historyLotsJson = $_COOKIE['history_lots']?? '[]';
var_dump($historyLotsJson); // интереснее взглянуть, что там за json
$historyLots = json_decode($historyLots);

$tab = $_GET['tab']?? '';
$idLot = $_GET['id_lot']?? '';
if ($tab === 'lot' and !in_array($idLot, $historyLots)) {
    $historyLots[] = $idLot;
    setcookie('history_lots', json_encode($historyLots), strtotime('next year'), '/');
}

Видите? Переменные делают ваш код проще. Даже если в коде или в данных будет ошибка, разобраться с проблемой будет легче.

→ Ссылка