Я хочу умножить значение с другим значением из 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>"; }
}?>