0

我正在使用 Resellers Panel API 来解决以下问题。(文档

我有一个带有 foreach 的 Curl 脚本。这是从经销商面板 api 获取国家/地区列表。

function getCountries() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "myapiurl");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, POST);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $final = curl_exec($ch);
    $result = explode(" ", $final);

        echo '<select>';
        foreach ($result as $country => $name) {
            echo '<option>'.$country. '</option>';
        }

        echo '</select>';

    curl_close($ch);
}

上面的代码导致:

<select> 
   <option>1</option>
   <option>2</option>
</select>

对于列出的所有 114 个国家/地区,这种情况仍在继续。我觉得没有必要在这里放置所有 114 个选项。

看起来好像 foreach 只是计算 curl 的每个结果并将其发布在选择中。我怎样才能让它真正呼应国家名称而不仅仅是计数?

原始形式的 API 结果如下所示:例如,仅列出一个国家/地区。

<ampa>
  <command>"0"
  <error_code>0</error_code>
  <countries>
    <n0>
      <name>Afghanistan</name>
      <iso2>AF</iso2>
      <phone_code>93</phone_code>
    </n0>
 </countries>
</ampa>

更新

我试过echo '<option value="'.$country.'">'.$name. '</option>';了,结果如下:

<option value="0">
0
0
56000


        Afghanistan
        AF
        93


        Albania
        AL
        355


        Algeria
        DZ
        213


        American</option>

当我回显 $final 时,我收到了这个(简而言之):

0 0 56000 Afghanistan AF 93 Albania AL 355 Algeria DZ 213 American Samoa AS 684 Andorra AD 376 Angola AO 244 Anguilla AI 1 Antarctica AQ 672 AG 1 Argentina AR 54 Armenia AM 374 Aruba AW 297 Australia AU 61 Austria AT 1 0 0.2 43

而且我希望能够使用 foreach 语句在选择中呼应国家名称。

前任:

<select>
 <option>United States</option>
</select>
4

2 回答 2

0
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "myapiurl");
curl_setopt($ch, CURLOPT_POST, 1);
# curl_setopt($ch, CURLOPT_POSTFIELDS, POST);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$final = curl_exec($ch);

$domd = new DOMDocument();
$domd->loadXML($final);
$countries = $domd->getElementsByTagName('countries')->item(0)->childNodes;

echo '<select>';

foreach($countries AS $country){
    // the following is just to make sure we only get tags with the name "n\d+"
    if(preg_match('/n\d+/', $country->tagName)){
        $name = $country->getElementsByTagName('name');
        // to make sure there's a sub-tag named "name"
        if($name->length!=1) continue;
        echo '<option value="'.$country->tagName.'">'
        .$name->item(0)->nodeValue.'</option>';
    }
}

echo '</select>';

我注释掉的 curl_setopt 行毫无意义,应该给你一个警告或错误。POST 应该是一个带有 post 值的长字符串,就像在 url 中获取值一样。variable1=value1&variable2=value2&variable3=value3 等。这用于向服务器发送特定的“调用”,也许它会给你不同的输出,例如只是一些国家而不是所有国家。

您也可以按照 Steven 的建议使用 simplexml。这几乎是一回事。

于 2013-10-28T05:23:11.097 回答
0

我认为你错误地爆炸了字符串。你是爆炸“”,空字符串。但根据您的返回,我认为它是 XML 节点格式。如果您打印出所有内容,它会显示所有节点信息,但您只需要<name>Afghanistan</name>. 尝试用户simplexml_load_string,是一个php函数。simplexml_load_string中的示例。所以可以直接访问namenode. 希望这有帮助。

于 2013-10-28T04:41:50.563 回答