Как разобрать массив внутри массива

Я пытаюсь разобрать информацию, которая находится внутри массива. Массив исходит из RSS-канала, который я преобразовал в json. Массив:

<channel>
<item>
    <title> Title A </title>
    <description> Description A </description>
    <stuff url = "google.com" type = "search engine">
</item>

<item>
    <title> Title B </title>
    <description> Description B </description>
    <stuff url = "yahoo.com" type = "old stuff">
</item>
....

</channel>

Я разбираю, используя что-то вроде:

$newsoutput = json_decode(json_encode($the_RSS_Link), TRUE);

foreach ($newsoutput['channel']['item'] as $item) {
   echo $item['title'];
   echo "<br>";
   echo $item['description'];
   echo "<br>";
   echo $item['stuff']['url'];
   echo "<br>";
}

Я могу получить как «название», так и «описание»; но я не могу извлечь значения "url" внутри "материала". Я пробовал различные комбинации без везения

Пожалуйста, порекомендуйте.

Спасибо,

ЧАС.

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

RiggsFolly 29.05.2019 14:28

@Hernandito, ты тоже можешь опубликовать json?

St3an 29.05.2019 15:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
1
2
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если содержимое RSS похоже на то, что вы разместили в примере, вам следует анализировать RSS-канал с помощью синтаксического анализатора XML вместо использования функций json_*.

Вот несколько простых примеров использования SimpleXML https://www.php.net/manual/en/simplexml.examples-basic.php

Спасибо, Том... Я буду использовать это для справки.

Hernandito 29.05.2019 18:24

Предполагая, что у вас есть действительный XML (что вы должны сделать, если это действующая плата за RSS), вы можете использовать синтаксический анализатор SimpleXML:

$xml = '<channel>
<item>
    <title> Title A </title>
    <description> Description A </description>
    <stuff url = "google.com" type = "search engine"/>
</item>

<item>
    <title> Title B </title>
    <description> Description B </description>
    <stuff url = "yahoo.com" type = "old stuff"/>
</item></channel>';
$x = new simplexmlelement($xml);
foreach($x->item as $item){
    echo $item->title . ' ' . $item->stuff['url'] . ' ' . $item->stuff['type'] . PHP_EOL;
}

https://3v4l.org/6ICrG

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

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

Hernandito 29.05.2019 18:22

@Hernandito Ладно, для меня это не имеет смысла. Зачем кодировать, чтобы декодировать? В SimpleXML уже есть вся информация.

user3783243 29.05.2019 18:26
Ответ принят как подходящий

Это проверенный и рабочий пример, который требует использования simplexml_load_string()

<?php
$raw = <<<XML
<?xml version='1.0'?> 
<document>
    <channel>
        <item>
            <title>Title A</title>
            <description>Description A</description>
            <stuff url = "google.com" type = "search engine"></stuff>
        </item>

        <item>
            <title>Title B</title>
            <description>Description B</description>
            <stuff url = "yahoo.com" type = "old stuff"></stuff>
        </item>
    </channel>
</document>
XML;

$xml = simplexml_load_string($raw);
$newsoutput = json_decode(json_encode($xml), true);

foreach ($newsoutput['channel']['item'] as $item) {
    echo $item['title'];
    echo "<br>\n";
    echo $item['description'];
    echo "<br>\n";
    echo $item['stuff']['@attributes']['url'];
    echo "<br>\n";
}

Выход:

Title A<br>
Description A<br>
google.com<br>
Title B<br>
Description B<br>
yahoo.com<br>

Будьте осторожны, XML-документ, который вы нам дали, недействителен, и мне пришлось закрыть тег.

Спасибо, Матье... @attributes - это то, чего мне не хватало. Задача решена! Еще раз спасибо.

Hernandito 29.05.2019 18:20

Почему json_decode(json_encode? Почему бы просто не получить к ним доступ через SimpleXML, который уже делает их доступными?

user3783243 29.05.2019 18:25

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

Mathieu Bour 29.05.2019 18:26

Что вы имеете в виду под "Это делает"?

user3783243 29.05.2019 18:27

Имеет смысл избегать двойного кодирования/декодирования json. Извините, если было непонятно!

Mathieu Bour 29.05.2019 18:28

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