2014-06-23 60 views
1

我想從一個XML文件乘以另一個值的值,它的工作原理,但不是因爲我想。如果$amount是5,當我乘以$eurotodollar我仍然得到5不是6.882。有我丟失的東西在這裏...如何從xml文件中提取值並進行數學運算?

我有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> 
+1

做過任何基本的調試,比如'echo $ eurtodollar'來查看simplexml正在吐出什麼東西? –

+0

是的,但它完美的回聲,只是在計算後是問題 – MariusB

+0

@MarcB:這將它投到字符串,這不會解釋爲什麼它始終是1。 – hakre

回答

1

我想使變量持股量將解決您的問題。爲了得到與SimpleXMLElement獲得變量的浮點值,可以使用floatval功能:

floatval($var); 

FPR例如,你可以使用

$result = $amount * floatval($eurtodollar) 
+0

我看到它的工作原理,我只想感謝你。如果還有其他方法可以做到這一點,您只需在此處發帖 – MariusB

+0

Upvote並接受它作爲答案。謝謝 – souvickcse

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>"; 
    } 

} >

1

什麼?你在這裏的經驗是,如果你這樣做:

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

可變$eurtodollar包含類型的SimpleXMLElement的對象。

當您將該對象與PHP中的數字相乘時,PHP必須進行一些類型轉換,因爲您無法將對象與數字相乘(您可能知道,只能將一個數字與另一個數字相乘;) ):

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

這樣可以使您回到可能意外的整數1。這是因爲當你multiply an integer與一個對象,the object is cast布爾是TRUE[1]然後被轉換爲整數是1(一)。

所以,你寫的東西有

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

不過,如果你投的對象爲浮動,那麼PHP將首先嚐試將對象轉換成字符串(這是可能的一個SimpleXMLElement與任何具有__toString() method),然後將字符串轉換成浮子其由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 

這是全魔。

請參閱String conversion to numbers瞭解更多信息。


[1]在PHP通常所有的對象將投射到布爾TRUE,然而的SimpleXMLElement是特殊這裏,因爲它可以是布爾值FALSE以及空時(例如<Rate></Rate>)。以此作爲第一個元素,您將始終得到0。

+0

很好的解釋,非常感謝 – MariusB

+0

謝謝。我個人也更喜歡'(float)$ var'在函數調用'floatval($ var)'上強制轉換,因爲恕我直言,它對代碼的作用(類型轉換)更具描述性。 – hakre

+0

這就是我所做的。我是新手,我仍然有很多問題與所有這些 – MariusB

相關問題