2

如果这是一个微不足道的问题,我深表歉意。我进行了搜索,但没有找到我的问题的答案,所以我发布了。预先感谢任何可以帮助我的人,并感谢您抽出宝贵的时间。我正在尝试对 api (sanfrancisco.crimespotting.org) 返回的犯罪数据进行简单解析并遇到障碍。下面的代码非常简单。

<? 
$url = "http://sanfrancisco.crimespotting.org/crime-data?format=xml&count=5&dstart=2009-04-20";

$reports = new SimpleXMLElement($url, NULL, TRUE);

foreach ($reports-> report as $key => $value)
            {
            echo '<br />';
            echo '<b>Case #:</b> '.$reports -> report['case_number'];
            echo '<br />';
            echo '<b>Crime type</b> '.$reports -> report['crime_type'];
            echo '<br />';
            echo '<b>Date/Time:</b> '.$reports -> report['date_time'];
            echo '<br />';
            echo '<b>Date </b> '.$reports -> report['date'];
            echo '<br />';
            echo '<b>Time:</b> '.$reports -> report['time'];
            echo '<br />';
            echo '<b>More Info </b> '.$reports -> report['href'];
            echo '<br />';
            echo '<br />';
            echo '<br />';
            }
?>

api 返回 5 个报告,因为当我在浏览器中测试 url 时,我看到返回了 5 个报告标签。这是我的浏览器的输出。

            <reports>
            <report case_number="120220205" crime_type="Vehicle Theft" date_time="2012-07-17T23:10:00-07:00" date="Tuesday, Jul 17, 2012" time="11:10pm" lat="37.772441" lon="-122.412422" beat="" href="http://sanfrancisco.crimespotting.org/crime/2012-07-17/Vehicle_Theft/320858">STOLEN AUTOMOBILE</report>
            <report case_number="120560807" crime_type="Alcohol" date_time="2012-07-16T13:35:00-07:00" date="Monday, Jul 16, 2012" time="1:35pm" lat="37.783288" lon="-122.408954" beat="" href="http://sanfrancisco.crimespotting.org/crime/2012-07-16/Alcohol/334582">
            UNDER INFLUENCE OF ALCOHOL IN A PUBLIC PLACE (ARREST, BOOKED)
            </report>
            <report case_number="120559850" crime_type="Disturbing the Peace" date_time="2012-07-16T13:00:00-07:00" date="Monday, Jul 16, 2012" time="1:00pm" lat="37.778678" lon="-122.416545" beat="" href="http://sanfrancisco.crimespotting.org/crime/2012-07-16/Disturbing_The_Peace/334575">COMMITTING PUBLIC NUISANCE (ARREST, CITED)</report>
            <report case_number="120560653" crime_type="Theft" date_time="2012-07-16T12:35:00-07:00" date="Monday, Jul 16, 2012" time="12:35pm" lat="37.784644" lon="-122.414271" beat="" href="http://sanfrancisco.crimespotting.org/crime/2012-07-16/Theft/334580">PETTY THEFT SHOPLIFTING</report>
            <report case_number="120560700" crime_type="Theft" date_time="2012-07-16T12:00:00-07:00" date="Monday, Jul 16, 2012" time="12:00pm" lat="37.78966" lon="-122.400934" beat="" href="http://sanfrancisco.crimespotting.org/crime/2012-07-16/Theft/334581">GRAND THEFT BICYCLE</report>
            </reports>

如您所见(上图),每个报告标签都有不同的 case_number 属性(例如 120220205、120560807 等)。但是,当我加载页面时,这是我收到的输出。

            Case #: 120220205
            Crime type Vehicle Theft
            Date/Time: 2012-07-17T23:10:00-07:00
            Date Tuesday, Jul 17, 2012
            Time: 11:10pm
            More Info http://sanfrancisco.crimespotting.org/crime/2012-07-17/Vehicle_Theft/320858



            Case #: 120220205
            Crime type Vehicle Theft
            Date/Time: 2012-07-17T23:10:00-07:00
            Date Tuesday, Jul 17, 2012
            Time: 11:10pm
            More Info http://sanfrancisco.crimespotting.org/crime/2012-07-17/Vehicle_Theft/320858



            Case #: 120220205
            Crime type Vehicle Theft
            Date/Time: 2012-07-17T23:10:00-07:00
            Date Tuesday, Jul 17, 2012
            Time: 11:10pm
            More Info http://sanfrancisco.crimespotting.org/crime/2012-07-17/Vehicle_Theft/320858



            Case #: 120220205
            Crime type Vehicle Theft
            Date/Time: 2012-07-17T23:10:00-07:00
            Date Tuesday, Jul 17, 2012
            Time: 11:10pm
            More Info http://sanfrancisco.crimespotting.org/crime/2012-07-17/Vehicle_Theft/320858



            Case #: 120220205
            Crime type Vehicle Theft
            Date/Time: 2012-07-17T23:10:00-07:00
            Date Tuesday, Jul 17, 2012
            Time: 11:10pm
            More Info http://sanfrancisco.crimespotting.org/crime/2012-07-17/Vehicle_Theft/320858

由于我使用 foreach 循环遍历返回的结果,我不知道为什么第一种情况会重复 5 次,因为我知道 foreach 循环应该自动递增。

4

5 回答 5

3

$reports -> report只需在循环中替换$value即可使其工作。

在没有多个相同标签的情况下,它似乎SimpleXMLElement允许$reports->report用作可枚举对象和简单对象以进行简化。

这很可能是您没有收到错误的原因!

于 2012-08-04T00:17:44.850 回答
3

您没有在 foreach 循环中使用增量数据。你想做这样的事情:

foreach ($reports->report as $report)
{
    echo '<br />';
    echo '<b>Case #:</b> ' . $report['case_number'];
    // ...
}

在您的代码中,您正在迭代$reports->report,$key => $value而不是使用迭代值($key$value),而是调用$reports->report,这不会随着循环的迭代而改变。

于 2012-08-04T00:17:55.900 回答
0

我要感谢所有这么快就提供帮助的人。在查看了更多 PHP 文档(特别是http://tinyurl.com/36a4aet)之后,我发现我需要在 $reports (作为它的根标记)上使用 children() 方法来获取每个报告,然后为每个报告标签调用 attributes() 方法来获取报告的其余数据。下面的新代码似乎已经成功了:)。

            foreach ($reports->children() as $node)
            {
                    $attribs = $node->attributes();
                    echo '<br />';
                    echo '<b>Case #:</b> '.$attribs["case_number"];
                    echo '<br />';
                    echo '<b>Crime type:</b> '.$attribs["crime_type"];
                    echo '<br />';
                    echo '<b>Date/Time:</b> '.$attribs["date_time"];
                    echo '<br />';
                    echo '<b>Date </b>: '.$attribs["date"];
                    echo '<br />';
                    echo '<b>Time:</b> '.$attribs["time"];
                    echo '<br />';
                    echo '<b>More Info: </b> <a href='.$attribs["href"].'>'.$attribs["href"].'</a>';
                    echo '<br />';
                    echo '<br />';
            }
于 2012-08-07T00:34:54.630 回答
0

您在循环中既没有提到 $key 也没有提到 $value !您总是指的是 $reports->report['case_number'],它总是相同的。

编辑:我忘了提到你应该迭代 $reports。

于 2012-08-04T00:20:29.943 回答
0

您的 foreach 语法错误。尝试将$reports -> reportforeach 块内部替换为$value

于 2012-08-04T00:17:31.723 回答