Как извлечь значения из xml-файла и выполнить математические операции?

Я хочу умножить значение с другим значением из xml-файла, оно работает, но не так, как я хочу. Если $amount равна 5, когда я $eurotodollar с $eurotodollar я все равно получаю 5, а не 6.882. Здесь что-то не хватает …

У меня есть php код:

  <?php $xml = simplexml_load_file('curr.xml')or die("Error: Cannot create object"); $eurtodollar = $xml->OrigCurrency->Cube->Rate[0]; if(isset($_POST['submit'])) { $amount = $_POST['amount']; $cur1 = $_POST['cur1']; if(!isset($_POST['cur2'])) { echo "<center><b>Enter Values</b><br></center>"; }else{ $cur2 = $_POST['cur2']; } if($cur1=="EUR" AND $cur2=="USD") { echo "<center><b>Your Converted Amount is:</b><br></center>"; echo "<center>" . $amount*$eurtodollar . "</center>"; } } ?> 

и xml код:

 <body> <OrigCurrency val="Euro"> <Cube date="2014-06-20"> <Rate currency="USD">1.3764</Rate> <Rate currency="CHF">1.2079</Rate> <Rate currency="GBP">0.8731</Rate> </Cube> </OrigCurrency> </body> 

Я думаю, что создание переменной float позволит исправить вашу проблему. Чтобы получить значение float из переменной с помощью SimpleXMLElement, вы можете использовать функцию floatval :

 floatval($var); 

Например, вы можете использовать Fpr

 $result = $amount * floatval($eurtodollar) 

Что вы испытываете здесь, так это то, что вы делаете:

  $eurtodollar = $xml->OrigCurrency->Cube->Rate[0]; 

Переменная $eurtodollar содержит объект типа SimpleXMLElement .

Когда вы теперь умножаете этот объект на число в PHP, PHP должен делать некоторые преобразования типов, потому что вы не можете умножить объект на число (как вы могли бы знать, вы можете только умножить число на другой номер;)):

  var_dump(1 * $eurtodollar); # int(1) 

Таким образом, вы вернете целое число 1, которое может быть неожиданным. Это связано с тем, что когда вы умножаете целое число с объектом, объект передается в Boolean, который является TRUE [1], который затем преобразуется в целое число, которое равно 1 (одному).

Так что вы пишете там

  1 * SimpleXMLElement <Rate currency="USD">1.3764</Rate> => 1 * TRUE => 1 * 1 == 1 

Однако, если вы добавите объект в float , PHP сначала попытается преобразовать объект в строку (что возможно с помощью SimpleXMLElement как с любым объектом, который имеет __toString() ), и затем строка преобразуется в поплавок, который также выполняется PHP:

 var_dump(1 * (float) $eurtodollar); # double(1.3764) 

Это тогда:

  1 * (float) SimpleXMLElement <Rate currency="USD">1.3764</Rate> => 1 * (float) "1.3764" => 1 * 1.3764 == 1.3764 

Аналогично, вы можете просто использовать только строки и PHP, а затем снова преобразуйте их в число:

 var_dump(1 * (string) $eurtodollar); # double(1.3764) 

Это тогда:

  1 * (string) SimpleXMLElement <Rate currency="USD">1.3764</Rate> => 1 * "1.3764" => 1 * 1.3764 == 1.3764 

И это вся магия.

Дополнительную информацию см. В разделе Преобразование строк в номера .


[1] Обычно все объекты в PHP будут отбрасываться в Boolean TRUE , однако SimpleXMLElement здесь особенный, поскольку он может быть Boolean FALSE а также пустым (например, <Rate></Rate> ). С этим, как с первым элементом, вы будете получать 0 все время.

 <?php $xml = simplexml_load_file('curr.xml')or die("Error: Cannot create object"); $eurtodollar = $xml->OrigCurrency->Cube->Rate[0]; if(isset($_POST['submit'])) { $amount = $_POST['amount']; $cur1 = $_POST['cur1']; if(!isset($_POST['cur2'])) { echo "<center><b>Enter Values</b><br></center>"; }else{ $cur2 = $_POST['cur2']; } if($cur1=="EUR" AND $cur2=="USD") { echo "<center><b>Your Converted Amount is:</b><br></center>"; echo "<center>" . ($amount* (float) $eurtodollar) . "</center>"; } 

}?>