Как получить доступ к объекту внутри многомерного массива с декодированием json в PHP?

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

Отображение массива:

// Get response
$synresponse = curl_exec($chs);
// Decode
$variants = json_decode($synresponse, true); 

Возвращает:

{
    "code": 200,
    "result": {
        "sync_product": {
            "id": 118425517,
            "external_id": "5d02e1420b4007",
            "name": "Women's Crop Top",
            "variants": 4,
            "synced": 4
        },
        "sync_variants": [
            {
                "id": 1335801688,
                "external_id": "5d02e1420b4141",
                "sync_product_id": 118425517,
                "name": "Women's Crop Top - S",
                "synced": true,
                "variant_id": 8039,
                "retail_price": "22.50",
                "currency": "USD",
                "product": {
                    "variant_id": 8039,
                    "product_id": 224,
                    "image": "https://d1yg28hrivmbqm.cloudfront.net/products/224/8039_1550478004.jpg",
                    "name": "Los Angeles Apparel 2332 Fine Jersey Short Sleeve Cropped T-Shirt /w Tear Away Label (White / S)"
                },
                "files": [
                    {
                        "id": 120674338,
                        "type": "default",
                        "hash": "6238a66581153315488397a5788216b2",
                        "url": null,
                        "filename": "logo2.png",
                        "mime_type": "image/png",
                        "size": 163254,
                        "width": 1380,
                        "height": 1380,
                        "dpi": null,
                        "status": "ok",
                        "created": 1560465358,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_preview.png",
                        "visible": true
                    },
                    {
                        "id": 120686478,
                        "type": "preview",
                        "hash": "fa1a4b2f561f28529f4230ba49eca1db",
                        "url": null,
                        "filename": "mockup-79b7c377.png",
                        "mime_type": "image/png",
                        "size": 113878,
                        "width": 600,
                        "height": 600,
                        "dpi": 43,
                        "status": "ok",
                        "created": 1560469826,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png",
                        "visible": false
                    }
                ],
                "options": []
            },
            {
                "id": 1335801689,
                "external_id": "5d02e1420b41b9",
                "sync_product_id": 118425517,
                "name": "Women's Crop Top - M",
                "synced": true,
                "variant_id": 8040,
                "retail_price": "22.50",
                "currency": "USD",
                "product": {
                    "variant_id": 8040,
                    "product_id": 224,
                    "image": "https://d1yg28hrivmbqm.cloudfront.net/products/224/8040_1550478002.jpg",
                    "name": "Los Angeles Apparel 2332 Fine Jersey Short Sleeve Cropped T-Shirt /w Tear Away Label (White / M)"
                },
                "files": [
                    {
                        "id": 120674338,
                        "type": "default",
                        "hash": "6238a66581153315488397a5788216b2",
                        "url": null,
                        "filename": "logo2.png",
                        "mime_type": "image/png",
                        "size": 163254,
                        "width": 1380,
                        "height": 1380,
                        "dpi": null,
                        "status": "ok",
                        "created": 1560465358,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_preview.png",
                        "visible": true
                    },
                    {
                        "id": 120686478,
                        "type": "preview",
                        "hash": "fa1a4b2f561f28529f4230ba49eca1db",
                        "url": null,
                        "filename": "mockup-79b7c377.png",
                        "mime_type": "image/png",
                        "size": 113878,
                        "width": 600,
                        "height": 600,
                        "dpi": 43,
                        "status": "ok",
                        "created": 1560469826,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png",
                        "visible": false
                    }
                ],
                "options": []
            },
            {
                "id": 1335801690,
                "external_id": "5d02e1420b41f3",
                "sync_product_id": 118425517,
                "name": "Women's Crop Top - L",
                "synced": true,
                "variant_id": 8041,
                "retail_price": "22.50",
                "currency": "USD",
                "product": {
                    "variant_id": 8041,
                    "product_id": 224,
                    "image": "https://d1yg28hrivmbqm.cloudfront.net/products/224/8041_1550478000.jpg",
                    "name": "Los Angeles Apparel 2332 Fine Jersey Short Sleeve Cropped T-Shirt /w Tear Away Label (White / L)"
                },
                "files": [
                    {
                        "id": 120674338,
                        "type": "default",
                        "hash": "6238a66581153315488397a5788216b2",
                        "url": null,
                        "filename": "logo2.png",
                        "mime_type": "image/png",
                        "size": 163254,
                        "width": 1380,
                        "height": 1380,
                        "dpi": null,
                        "status": "ok",
                        "created": 1560465358,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_preview.png",
                        "visible": true
                    },
                    {
                        "id": 120686478,
                        "type": "preview",
                        "hash": "fa1a4b2f561f28529f4230ba49eca1db",
                        "url": null,
                        "filename": "mockup-79b7c377.png",
                        "mime_type": "image/png",
                        "size": 113878,
                        "width": 600,
                        "height": 600,
                        "dpi": 43,
                        "status": "ok",
                        "created": 1560469826,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png",
                        "visible": false
                    }
                ],
                "options": []
            },
            {
                "id": 1335801691,
                "external_id": "5d02e1420b4238",
                "sync_product_id": 118425517,
                "name": "Women's Crop Top - XL",
                "synced": true,
                "variant_id": 8042,
                "retail_price": "22.50",
                "currency": "USD",
                "product": {
                    "variant_id": 8042,
                    "product_id": 224,
                    "image": "https://d1yg28hrivmbqm.cloudfront.net/products/224/8042_1550478006.jpg",
                    "name": "Los Angeles Apparel 2332 Fine Jersey Short Sleeve Cropped T-Shirt /w Tear Away Label (White / XL)"
                },
                "files": [
                    {
                        "id": 120674338,
                        "type": "default",
                        "hash": "6238a66581153315488397a5788216b2",
                        "url": null,
                        "filename": "logo2.png",
                        "mime_type": "image/png",
                        "size": 163254,
                        "width": 1380,
                        "height": 1380,
                        "dpi": null,
                        "status": "ok",
                        "created": 1560465358,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/623/6238a66581153315488397a5788216b2_preview.png",
                        "visible": true
                    },
                    {
                        "id": 120686478,
                        "type": "preview",
                        "hash": "fa1a4b2f561f28529f4230ba49eca1db",
                        "url": null,
                        "filename": "mockup-79b7c377.png",
                        "mime_type": "image/png",
                        "size": 113878,
                        "width": 600,
                        "height": 600,
                        "dpi": 43,
                        "status": "ok",
                        "created": 1560469826,
                        "thumbnail_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_thumb.png",
                        "preview_url": "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png",
                        "visible": false
                    }
                ],
                "options": []
            }
        ]
    },
    "extra": []
}

Я пытаюсь получить доступ к элементам из files следующим образом:

foreach($variants['result'] as $variant){

//access file images
$imgurl = $variant['files']['preview_url'];

echo '<img src = "$imgurl">';
echo '<br>';

}

Я получаю ошибки:

Notice: Undefined index: files

Notice: Undefined index: preview_url

Может кто-нибудь объяснить мне, что я не понимаю, пожалуйста?

Возможно foreach($variants['result']["sync_variants"] as $variant){?

dWinder 16.06.2019 21:32
Стоит ли изучать 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
1
126
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этот код должен помочь. Проблема была связана с дополнительным подмассивом.

foreach($variants['result']['sync_variants'] as $variant) {
    foreach($variant['files'] as $file) {
        //access file images
        $imgurl = $file['preview_url'];

        echo '<img src = "' . $imgurl . '">';
        echo '<br>';
    }
}

Ответ на комментарий:

foreach($variants['result']['sync_variants'] as $variant) {
    foreach($variant['files'] as $file) {
        if ($file['type'] != 'preview') {
            continue;
        }

        //access file images
        $imgurl = $file['preview_url'];    

        echo '<img src = "' . $imgurl . '">';
        echo '<br>';
    }
}

Да это ответ. Поскольку вы дали правильный ответ, можете ли вы сказать мне, как мне получить доступ ко второму файлу preview_url из файлов, а не к первому файлу preview_url? Как мне получить URL-адрес от «id»: 120686478?

user10844414 16.06.2019 21:49

Да, спасибо, но ваш ответ на комментарий не является динамическим. Идентификатор меняется для каждого продукта.

user10844414 16.06.2019 22:02

@Thisisme Я изменил код на проверку по типу, как я предлагал ранее

Anton 16.06.2019 22:09
Ответ принят как подходящий

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

$variant['files'][1]['preview_url']

или

$variant['files'][0]['preview_url']

Тестовое задание

$variants = json_decode($variants, true);
$html = '';
foreach ($variants['result']["sync_variants"] as $variant) {
    $html .= '<img src = "' . $variant['files'][1]['preview_url'] . '"><br>';
}

echo $html;

Выход

<img src = "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png"><br>
<img src = "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png"><br>
<img src = "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png"><br>
<img src = "https://d1yg28hrivmbqm.cloudfront.net/files/fa1/fa1a4b2f561f28529f4230ba49eca1db_preview.png"><br>

Спасибо за это. Я получаю неопределенный индекс 1. Мне бы хотелось получить доступ ко второму URL-адресу предварительного просмотра

user10844414 16.06.2019 22:01

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