注意:使用foreach和xml的未定义偏移量

时间:2013-10-21 21:33:10

标签: php xml foreach

我一直在搜索过去一小时的先前问题,所以如果这个问题存在于其他地方,抱歉,但我没有找到它。我是PHP的新手,所以请原谅我这是一个新手问题。我也在谷歌搜索过。

我正在尝试自动从airnav.com获取各种机场的lat / long信息以进行地图更新。我有一个带有机场代码的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AIRPORTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AIRPORT>MXA</AIRPORT>
  <AIRPORT>SDM</AIRPORT>
</AIRPORTS>

我的PHP是:

<?php
  $xml=simplexml_load_file("airports.xml");

  foreach($xml->AIRPORT as $arpt)
  {
    if (preg_match('#[0-9]#', $arpt)){
      $arptName = $arpt;}

    else{
      $arptName = "K" . $arpt;}

    $content = file_get_contents("http://www.airnav.com/airport/" . $arptName);

    preg_match('#([0-9]{2,2}\.[0-9]{1,})\s\/\s(\-[0-9]{2,2}\.[0-9]{1,})#', $content, $arptmatch);

    $lat = $arptmatch[1]; //ERROR HERE (line 27)
    $long = $arptmatch[2]; //AND HERE (line 28)

    echo "Airport: $arpt\nLat: $lat\nLong: $long\n";
  }
?>

这对第一个机场来说效果很好,我明白了:

Airport: MXA Lat: 35.8944444 Long: -90.1545833 

当我去网站检查是正确的时候。但对于第二个机场,我得到了:

Airport: SDM Lat: Long: 

以下错误:

Notice: Undefined offset: 1 in /home/a5308473/public_html/phpStuff/readFromAirNav.html on line 27
Notice: Undefined offset: 2 in /home/a5308473/public_html/phpStuff/readFromAirNav.html on line 28

我似乎无法找到解决此问题的方法。谁知道什么是错的?

2 个答案:

答案 0 :(得分:1)

你只是假设preg_match找到了一些东西,并且盲目地向前闯入,即使实际上没有匹配。

尝试

if (preg_match(...)) {
    $lat = $arptmatch[1];
    $long = $arptmatch[2];
} else {
    $lat = 'n/a';
    $long = 'n/a';
}

代替。

答案 1 :(得分:0)

这是因为SDM的坐标是32.5722722 / -116.9801611。在正则表达式的第二部分中,116必须介于2到2个字符{2,2}之间。更改它以匹配2到3个字符{2,3}。如果您只使用美国坐标,那么{2,3}将起作用,但在美国之外,您可能遇到具有单个数字整数部分的坐标。 {1,3}将与任何经度的整数部分匹配,{1,2}将匹配任何纬度的整数部分。

你的正则表达式应该是

([0-9]{1,2}\.[0-9]{1,})\s\/\s(\-[0-9]{1,3}\.[0-9]{1,})

因为你的正则表达式与任何东西都不匹配,所以结果是一个0长度的数组,你的索引偏移量大于数组的长度。

此外,{2,2}可以写为{2}{1,}可以写为+