【问题标题】:Convert JSON data to HTML dropdown list with PHP使用 PHP 将 JSON 数据转换为 HTML 下拉列表
【发布时间】:2016-06-06 18:35:57
【问题描述】:

如何使用 PHP 将此 XML/JSON 数据转换为 HTML select 下拉列表?

JSON/XML 数据:

{"CountryList":"<Countries><Country><Code>AF<\/Code><Name>Afghanistan<\/Name><\/Country><Country><Code>AL<\/Code><Name>Albania<\/Name><\/Country><Country><Code>DZ<\/Code><Name>Algeria<\/Name><\/Country><Country><Code>AS<\/Code><Name>American Samoa<\/Name><\/Country><Country><Code>AD<\/Code><Name>Andorra<\/Name><\/Country><Country><Code>AO<\/Code><Name>Angola<\/Name><\/Country><Country><Code>AI<\/Code><Name>Anguilla<\/Name><\/Country><Country><Code>AQ<\/Code><Name>Antarctica<\/Name><\/Country><Country><Code>AG<\/Code><Name>Antigua &amp; Barbuda<\/Name><\/Country><Country><Code>AR<\/Code><Name>Argentina<\/Name><\/Country><Country><Code>AM<\/Code><Name>Armenia<\/Name><\/Country><Country><Code>AW<\/Code><Name>Aruba<\/Name><\/Country><Country><Code>AU<\/Code><Name>Australia<\/Name><\/Country><Country><Code>AT<\/Code><Name>Austria<\/Name><\/Country><Country><Code>AZ<\/Code><Name>Azerbaijan<\/Name><\/Country><Country><Code>BS<\/Code><Name>Bahamas<\/Name><\/Country><Country><Code>BH<\/Code><Name>Bahrain<\/Name><\/Country><Country><Code>BD<\/Code><Name>Bangladesh<\/Name><\/Country><Country><Code>BB<\/Code><Name>Barbados<\/Name><\/Country><Country><Code>BY<\/Code><Name>Belarus (Belorussia)<\/Name><\/Country><\/Countries>","Error":{"ErrorCode":0,"ErrorMessage":""},"Status":1,"TokenId":"bdf0738c-7a47-410e-961a-52da9b5df935"}

所需的 HTML 输出:

<select>
    <option value="AF|Afghanistan">Afghanistan</option>
    <option value="AL|Albania">Albania</option>
    <option value="DZ|Algeria">Algeria</option>
    <option value="AS|American Samoa">American Samoa</option>
    <option value="AD|Andorra">Andorra</option>
    <option value="AO|Angola">Angola</option>
    <option value="AI|Anguilla">Anguilla</option>
    <option value="AQ|Antarctica">Antarctica</option>
    <option value="AG|Antigua & Barbuda">Antigua & Barbuda</option>
    <option value="AR|Argentina">Argentina</option>
    <option value="AM|Armenia">Armenia</option>
    <option value="AW|Aruba">Aruba</option>
    <option value="AU|Australia">Australia</option>
    <option value="AT|Austria">Austria</option>
    <option value="AZ|Azerbaijan">Azerbaijan</option>
    <option value="BS|Bahamas">Bahamas</option>
    <option value="BH|Bahrain">Bahrain</option>
    <option value="BD|Bangladesh">Bangladesh</option>
    <option value="BB|Barbados">Barbados</option>
    <option value="BY|Belarus (Belorussia)">Belarus (Belorussia)</option
</select>


解析后得到这样的数组

数组
(
[CountryList] => AFA阿富汗AL阿尔巴尼亚DZ阿尔及利亚AS美属萨摩亚AD安道尔AO安哥拉AI安圭拉AQ南极洲AG安提瓜和巴布达AR阿根廷A亚美尼亚AWA鲁巴AU澳大利亚ATA奥地利AZ阿塞拜疆BS巴哈马BHBahrainBDB孟加拉国BB巴巴多斯BY白俄罗斯(白俄罗斯)

[错误] => 数组
(
[错误代码] => 0
[错误消息] =>
)

[状态] => 1

[TokenId] => 5a5e32c4-77ee-4703-b0b1-4ff275ac61asw0 )


我在以下链接中看到的数据 https://drive.google.com/file/d/0B9VV_J4sKTatdWJGeHJkOVZzZ00/view?usp=sharing

【问题讨论】:

  • 您的数据不是 XML,是 JSON 在“CountryList”对象中带有一些标签(自定义?我不知道格式)
  • 数据从何而来?来自 XML?你不能访问真正的 XML?
  • 乍一看,格式看起来很糟糕。好像 CountryList 中缺少所有开始标签。
  • 我投票决定将此问题作为题外话结束,因为它 - 以目前的形式 - 是一个“请写我的代码”问题
  • 请看我已编辑 JSON/XML 数据:在帖子中,

标签: php html json xml


【解决方案1】:

试试这个可能对你有帮助。

解决方案

$json = json_decode($data);$source = new DOMDocument();
$source->loadXml($json->CountryList);
$xpath = new DOMXpath($source);
$target = new DOMDocument();
$options = $target->appendChild($target->createElement('select'));

foreach ($xpath->evaluate('/Countries/Country') as $country) {
    $countryCode = $xpath->evaluate('string(Code)', $country);
    $countryName = $xpath->evaluate('string(Name)', $country);
    $option = $options->appendChild(
        $target->createElement('option')
    );
    $option->setAttribute('value', $countryCode . "|" . $countryName);
    $option->appendChild($target->createTextNode($countryName));
}

$target->formatOutput = TRUE;
echo $target->saveXml($options);

输出:

    <select>
        <option value="AF|Afghanistan">Afghanistan</option>
        <option value="AL|Albania">Albania</option>
        <option value="DZ|Algeria">Algeria</option>
        <option value="AS|American Samoa">American Samoa</option>
        <option value="AD|Andorra">Andorra</option>
        <option value="AO|Angola">Angola</option>
        <option value="AI|Anguilla">Anguilla</option>
        <option value="AQ|Antarctica">Antarctica</option>
        <option value="AG|Antigua & Barbuda">Antigua & Barbuda</option>
        <option value="AR|Argentina">Argentina</option>
        <option value="AM|Armenia">Armenia</option>
        <option value="AW|Aruba">Aruba</option>
        <option value="AU|Australia">Australia</option>
        <option value="AT|Austria">Austria</option>
        <option value="AZ|Azerbaijan">Azerbaijan</option>
        <option value="BS|Bahamas">Bahamas</option>
        <option value="BH|Bahrain">Bahrain</option>
        <option value="BD|Bangladesh">Bangladesh</option>
        <option value="BB|Barbados">Barbados</option>
        <option value="BY|Belarus (Belorussia)">Belarus (Belorussia)</option
     </select>

【讨论】:

    【解决方案2】:

    您的 JSON 以 XML 形式包含国家/地区。所以你必须先解码 JSON:

    $json = json_decode($data);
    

    之后解析 XML:

    $source = new DOMDocument();
    $source->loadXml($json->CountryList);
    $xpath = new DOMXpath($source);
    

    您可以使用 DOM 生成目标 XML。创建一个目标文档并附加根节点。使用 Xpath 迭代国家并创建/附加选项元素。

    $target = new DOMDocument();
    $options = $target->appendChild($target->createElement('select'));
    
    foreach ($xpath->evaluate('/Countries/Country') as $country) {
      $option = $options->appendChild(
        $target->createElement('option')
      );
      $option->setAttribute(
        'value', 
        $xpath->evaluate('string(Code)', $country)
      );
      $option->appendChild(
        $target->createTextNode(
          $xpath->evaluate('string(Name)', $country)
        )
      );
    }
    
    $target->formatOutput = TRUE;
    echo $target->saveXml($options);
    

    输出:

    <select>
      <option value="AF">Afghanistan</option>
      <option value="AL">Albania</option>
      <option value="DZ">Algeria</option>
      <option value="AS">American Samoa</option>
      <option value="AD">Andorra</option>
      <option value="AO">Angola</option>
      <option value="AI">Anguilla</option>
      ...
    

    【讨论】:

    • 它不工作它说。 注意: 试图获取非对象的属性。警告: DOMDocument::loadXML():作为输入提供的空字符串
    • 先生需要一点帮助,请再次查看问题。
    【解决方案3】:

    您的数据不是 XML,而是 JSON 字符串。

    如果可以访问原始XML数据,可以获得更好的结果。

    顺便说一句,要解码您当前的数据,请使用json_decode

    $data = json_decode($data);
    

    然后,创建一个匹配国家模式的模式并匹配$data-&gt;CountryList中的所有匹配项

    $pattern = '{([^<]+)</Code>([^<]+)</Name></Country>}';
    preg_match_all( $pattern, $data->CountryList, $matches );
    

    此时,您可以通过foreach 循环输出您的&lt;option&gt; 列表:

    foreach( $matches[0] as $key => $val )
    {
        echo sprintf( '<option value="%s">%s</option>', $matches[1][$key], $matches[2][$key] );
    }
    

    eval.in demo

    编辑:模式语法

    {([^<]+)</Code>([^<]+)</Name></Country>}
     └──┬──┘└──┬──┘└──┬──┘└─┬─────────────┘
        │      │      │     └ 2nd and 3rd tags (not captured)
        │      │      └ One or more chars except ‘<’ (2nd captured group)
        │      └ 1st tag (not captured)
        └ One or more chars except ‘<’ (1st captured group)
    

    【讨论】:

    • 它不会捕获“Code>1”和“Name>Something”而不是“1”和“Something”吗?
    • @SparK No. 查看演示(还要注意严格的字符串结构和数据类型、国家代码、国家名称)
    • @SparK 这不是 XML!
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多