在PHP中用XML构建SELECT标记

时间:2016-12-16 04:31:57

标签: php arrays xml dom codeigniter-3

我尝试使用数组中的select来创建option标记。我按如下方式从XML创建数组:

 foreach( $xml->children() as $key => $value ) {
                $nodes = array();
                 foreach( $value->children() as $k => $v ) {
                             $nodes[ ( string ) $v->getName() ] = ( string ) $v;
                      }
                $node = ( string ) $value->getName();
                $xml2Array[ $node ][] = $nodes;
            }
        $data['item']  = $xml2Array;

然后我得到这个数组:

Array
(
    [Item] => Array
        (
            [0] => Array
                (
                    [ItemCode] => 0002684
                    [MainUOMCode] => PAIR
                    [ItemName] => SHOES (8623; PINK)
                )

            [1] => Array
                (
                    [ItemCode] => 0003062
                    [MainUOMCode] => PAIR
                    [ItemName] => SHOES (8625; PINK)
                )

            [2] => Array
                (
                    [ItemCode] => 0003116
                    [MainUOMCode] => PAIR
                    [ItemName] => SHOES (8624; RED)
                )

            [3] => Array
                (
                    [ItemCode] => 0003125
                    [MainUOMCode] => PAIR
                    [ItemName] => SHOES (8624; YELLOW)
                )

我想用数组项填充select option

<select class="form-control js-example-diacritics">
                                        <option></option>
                                        <?php foreach ($item as $key => $arr){ ?>    
                                        <option value="<?=$arr['ItemCode'];?>"><?=$arr['ItemName'];?></option>
                                        <?php } ?>
                                    </select>

但上面的代码失败了:

<p>Severity: Notice</p>
<p>Message:  Undefined index: ItemCode</p>
<p>Filename: mutasi_antarserver/add_dagang.php</p>
<p>Line Number: 161</p>

请帮我修理一下。

3 个答案:

答案 0 :(得分:0)

试试这个:

$data['item']  = $xml2Array;

echo '<select class="form-control js-example-diacritics">';

foreach($data['item'] as $item)
{
   echo '<option value="'.$item['ItemCode'].'">'.$item['ItemName'].'</option>';
}

echo '</select>';

答案 1 :(得分:0)

我认为如果您使用的是Codeigniter,请尝试

<select class="form-control js-example-diacritics">
<option></option>
<?php foreach ($item['Item'] as $key => $arr){ ?>    
<option value="<?=$arr['ItemCode'];?>"><?=$arr['ItemName'];?></option>
<?php } ?>
</select>

答案 2 :(得分:0)

您可能正在使用SimpleXML扩展(从使用children()方法的方式来看很明显。)

迭代SimpleXMLElement

由于SimpleXMLElement实现了Traversable接口,您可以简单地迭代该对象以获取子项。此外,可以访问SimpleXMLElement的子项作为对象属性,即使用->运算符。

示例

<?php
$xml = <<<'XML'
<root>
  <Item>
    <ItemCode>00002345</ItemCode>
    <MainUOMCode>PAIR</MainUOMCode>
    <ItemName>SHOES (...)</ItemName>
  </Item>
  <Item>
    <ItemCode>032434</ItemCode>
    <MainUOMCode>XPAIR</MainUOMCode>
    <ItemName>SHOESxxx (...)</ItemName>
  </Item>
</root>
XML;

echo '<select class="form-control js-example-diacritics">', PHP_EOL;
$items = simplexml_load_string($xml);
foreach ($items as $item) {
    echo '<option value="', $item->ItemCode, '">',
        $item->ItemName, '</option>', PHP_EOL;
}
echo '</select>';

输出

<select class="form-control js-example-diacritics">
<option value="00002345">SHOES (...)</option>
<option value="032434">SHOESxxx (...)</option>
</select>

使用阵列语法

但是如果你坚持使用children()方法和数组语法,你可以将SimpleXMLElement强制转换为数组:

foreach ($items->children() as $item) {
    $item = (array) $item;
    echo '<option value="', $item['ItemCode'], '">',
        $item['ItemName'], '</option>', PHP_EOL;
}

顺便说一下,你的代码失败了,因为你试图以数组形式访问对象,而对象(SimpleXMLElement)没有实现ArrayAccessArrayObject

注意,您应该使用htmlspecialchars()函数转义HTML内容。