Как мне разобрать Array в Array - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь проанализировать информацию, которая находится внутри массива.Массив взят из 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>";
}

Я могу получить и "title" и "description";но я не могу извлечь значения "url" внутри "вещи".Я пробовал разные комбинации без удачи

Пожалуйста, сообщите.

Спасибо,

H.

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Это проверенный и рабочий пример, который требует использования 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-документ недействителен иМне пришлось закрыть тег.

1 голос
/ 29 мая 2019

Предполагая, что у вас есть действительный 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элемент здесь был изменен, поэтому он самозакрывающийся.

0 голосов
/ 29 мая 2019

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

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

...