简体   繁体   中英

how to get array data from XML loop foreach in php

I have currency output in XML like this :

<ValCurs Date="13.04.2019" name="Foreign Currency Market">
    <Valute ID="R01010">
      <NumCode>036</NumCode>
      <CharCode>AUD</CharCode>
      <Nominal>1</Nominal>
      <Name>Австралийский доллар</Name>
      <Value>46,0781</Value>
    </Valute>
    <Valute ID="R01020A">
      <NumCode>944</NumCode>
      <CharCode>AZN</CharCode>
      <Nominal>1</Nominal>
      <Name>Азербайджанский манат</Name>
      <Value>38,0295</Value>
    </Valute>
</ValCurs>

I want to get the <Name> , <Value> and <Valute> by supplying the <Valute> ID

I tried it with this foreach loop in php:

$xml = simplexml_load_string($url) or die ("error cannot create object");
$results = $xml->ValCurs;
$res=count($results);
echo " currency : $res <br><br>";
$output=array();
$keyword = array();
foreach($xml->ValCurs as $nodes){
$res=count($nodes);
    foreach ($nodes->Valute as $key =>$node) {
      $output=$node->NumCode;
      echo $output;
      echo "<br><br>";
      echo $keyword[]=substr($output,66);
      echo "<br><br>";  
    }
}
    echo"<hr>";
    echo $keyword[0];

Result is currency is 0

This is as simple as:

$s = '<ValCurs Date="13.04.2019" name="Foreign Currency Market">
    <Valute ID="R01010">
      <NumCode>036</NumCode>
      <CharCode>AUD</CharCode>
      <Nominal>1</Nominal>
      <Name>Австралийский доллар</Name>
      <Value>46,0781</Value>
    </Valute>
    <Valute ID="R01020A">
      <NumCode>944</NumCode>
      <CharCode>AZN</CharCode>
      <Nominal>1</Nominal>
      <Name>Азербайджанский манат</Name>
      <Value>38,0295</Value>
    </Valute>
</ValCurs>';

// Note, that `simplexml_load_string` uses a STRING, 
// if `$url` is url to some resource, first get data from 
// this resource and then load this data to SimpleXML
$xml = simplexml_load_string($s) or die ("error cannot create object");
foreach($xml as $node){
      echo $node->Name;
      echo "<br><br>";
      echo $node->Value;
      echo "<br><br>";
      echo $node['ID'];
      echo "<br><br>";
}

Fiddle here .

<?php
function object2array($object) { return @json_decode(@json_encode($object),1); }
$xmldata = <<<XML
<ValCurs Date="13.04.2019" name="Foreign Currency Market">
    <Valute ID="R01010">
      <NumCode>036</NumCode>
      <CharCode>AUD</CharCode>
      <Nominal>1</Nominal>
      <Name>Австралийский доллар</Name>
      <Value>46,0781</Value>
    </Valute>
    <Valute ID="R01020A">
      <NumCode>944</NumCode>
      <CharCode>AZN</CharCode>
      <Nominal>1</Nominal>
      <Name>Азербайджанский манат</Name>
      <Value>38,0295</Value>
    </Valute>
</ValCurs>
XML;
$xml = simplexml_load_string($xmldata) or die ("error cannot create object");
$xml_array=object2array($xml);
echo'<pre>';
print_r($xml_array);
foreach($xml_array['Valute'] as $key=>$value){
    echo $value['@attributes']['ID'].'<br>';
    echo $value['Name'].'<br>';
    echo $value['Value'].'<br>';
}

Sample output

R01010
Австралийский доллар
R01020A
Азербайджанский манат

Steps:

1) Convert XML to string by simplexml_load_string()

2) json_encode() string for decoding purpose.

3) json_deocde(): to return as array.

4) Loop over array

5) Append loop values to array newly created.

<?php
$xml = '<?xml version = "1.0" encoding = "utf-8"?>
<ValCurs Date="13.04.2019" name="Foreign Currency Market">
    <Valute ID="R01010">
      <NumCode>036</NumCode>
      <CharCode>AUD</CharCode>
      <Nominal>1</Nominal>
      <Name>Австралийский доллар</Name>
      <Value>46,0781</Value>
    </Valute>
    <Valute ID="R01020A">
      <NumCode>944</NumCode>
      <CharCode>AZN</CharCode>
      <Nominal>1</Nominal>
      <Name>Азербайджанский манат</Name>
      <Value>38,0295</Value>
    </Valute>
</ValCurs>';

$arr = [];
$array = json_decode(json_encode(simplexml_load_string($xml)),true);
if ( ! empty($array['Valute'])) {
 $i=0;
 foreach ($array['Valute'] as $elem) {
   $arr[$i]['NumCode'] = $elem['NumCode'];
   $arr[$i]['CharCode'] = $elem['CharCode'];
   $arr[$i]['Nominal'] = $elem['Nominal'];
   $arr[$i]['Name'] = $elem['Name'];
   $arr[$i]['Value'] = $elem['Value'];
  ++$i;
 }
}
echo '<pre>';print_r($arr);echo '</pre>';

Output:

Array
(
    [0] => Array
        (
            [NumCode] => 036
            [CharCode] => AUD
            [Nominal] => 1
            [Name] => Австралийский доллар
            [Value] => 46,0781
        )

    [1] => Array
        (
            [NumCode] => 944
            [CharCode] => AZN
            [Nominal] => 1
            [Name] => Азербайджанский манат
            [Value] => 38,0295
        )

)

Working Online Code:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM