Отображение объекта json_encoded, не работающего после обновления php 7.1

У меня есть два веб-сайта, один из которых работает на PHP 7.0, а другой - на PHP 7.1, у меня есть возможность хранить продукт в корзине на обоих, это все еще работает, но у продукта также есть параметры (например, цвет, размер и т. д.).

Это также должно быть показано в корзине покупок, иначе люди добавляют один и тот же товар дважды с разными вариантами, но люди видят один и тот же товар дважды и не могут различить их.

Я уже написал этот код, и на PHP 7.0 он работает, но на 7.1 параметры пусты, почему это могло быть?

Это мой код:

<?php
$n = 0;
$o = 0;

// Loop array inside select element where product options are selected

foreach($varpijp as $productvar) {
    // Filter anything empty

    if (!empty($productvar)) {
        $productvar['artikelid'] = $artikel['content_id'];
        $productvar['prodoptie'] = $o . $artikel['content_id'];

        // Empty options every loop

        $productopties = '';
        $productarray = '';

        // Loop options and make key useable with $key and value with $prodvalue

        foreach($productvar as $key => $prodvalue) {
            if ($key == 'Prijs') {
                $key = str_replace('Prijs', '', $key);
            } elseif ($key == 'prodoptie') {
                $key = '';
                $prodvalue = '';
            } elseif ($key == 'artikelid') {
                $key = '';
                $prodvalue = '';
            } else {
                $key = $key . ': ';
            }

            // Put results in variable $productopties

            $productopties.= $key . '' . $prodvalue . '&nbsp;&nbsp; ';
        }

        foreach($productvar as $key1 => $prodvalue1) {
            if ($key1 == 'Prijs') {
                $key1 = str_replace('Prijs', '', $key1);
            } else {
                $key1 = $key1 . ': ';
            }

            if ($key1 !== 'Prijs') {
                $productarray[] = $key1 . $prodvalue1;
                $serializedarray = json_encode($productarray);
            }
        }

        // Loop all option tags

        $productvars.= "<option value='" . $productvar['prodoptie'] . "' data-array='" . $serializedarray . "' data-optie='" . $o . "' data-src='" . $prijscalc . "'>" . $productopties . "</option>";
    }

    $n++;
    $o++;
}

echo $productvars;

Как я уже сказал, он отлично работает на 7.0, но когда я помещаю отчет об ошибках, чтобы показать все на моем сайте 7.1, я получаю сообщение об ошибке в этой строке:

$productarray[] = $key1 . $prodvalue1;

Создание такого массива, по-видимому, больше не работает, поэтому попробовал это так:

$productarray = array();
$productarray[] = $key1 . $prodvalue1;

Ошибка исчезла, но теперь мои параметры всегда пусты, и я не знаю почему.

Что я могу сделать, чтобы это исправить?

$productvars .= "<option value='".$productvar['prodoptie']."' data-array='".$serializedarray."' data-optie='".$o."' data-src='".$prijscalc."'>".$productopties."</option>";

В приведенном выше коде $serializedarray - это то, что мне нужно.

На рабочем сайте это выглядит например так:

["\u20ac 124,95  -  ","Aantal kratten: 1","artikelid: 40","prodoptie: 040"]

Но на сайте 7.1 продукт, который также имеет несколько вариантов, показывает мне только это:

["prodoptie: 0315"]

Это ошибка, которую я получаю:

Fatal error: Uncaught Error: [] operator not supported for strings in /home/website/public_html/product-page.php:256

Когда я использую тот же код, что и 7.0

Какую именно ошибку вы получаете?

deceze 08.01.2019 11:38

Просматривали ли вы журнал ошибок PHP, если нет, пожалуйста, и разместите полное сообщение об ошибке здесь, в своем вопросе

RiggsFolly 08.01.2019 11:40

@RiggsFolly Я добавил ошибку внизу своего вопроса.

twan 08.01.2019 11:42

Ошибка возникает из-за того, что ваша переменная $productarray является строковым типом. $productarray = '';, вы должны отредактировать это как $productarray = [];

BARNI 08.01.2019 11:44

Вы определяете $productarray = ''; как строку, поэтому вы не можете использовать ее как массив позже. В PHP 7.1 это обернулось фатальной ошибкой. В PHP 7.0 (и ранее) PHP автоматически преобразовывал переменную в массив.

M. Eriksson 08.01.2019 11:44
$productarray = ''; Вы определили / инициализировали переменную как STRING, а затем пытаетесь использовать ее как массив
RiggsFolly 08.01.2019 11:44

Я также рекомендовал бы вам определять переменные, которые вы используете после цикла до цикла. В противном случае ваш код выдаст несколько «неопределенных переменных», если в цикл не вошли, или если оператор if в цикле не оценивается как истина.

M. Eriksson 08.01.2019 11:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

$productarray; должен быть массивом, но определяется как строка: $productarray = '';.

Заменить это объявление на $productarray = array();

Для получения дополнительной информации об изменениях с php 7.0 на 7.1 см. официальная документация

String modification by character on an empty string now works like for non-empty strings, i.e. writing to an out of range offset pads the string with spaces, where non-integer types are converted to integer, and only the first character of the assigned string is used. Formerly, empty strings where silently treated like an empty array.

Спасибо. Сайт снова работает отлично.

twan 08.01.2019 11:49

Другие вопросы по теме