3

使用 PHP,我想编写一个从 XML 中获取数字并将这些数字相乘的函数。但是,我不知道如何在 SimpleXML 中使用十进制数。

PHP

$xml = new SimpleXMLElement(
'<DOM>
  <TAB id="ID1" width="30.1" height="0.5" ></TAB> 
  <TAB id="ID2" width="15.7" height="1.8" ></TAB>
</DOM>');

foreach ($xml->children() as $second_level) {
    echo $second_level->attributes()->id."<br>";
    echo ($second_level->attributes()->width * 10)."<br>";
    echo ($second_level->attributes()->height * 10)."<br>";
}

当前(错误)输出:

ID1 
300
0
ID2
150
10

正确的输出应该是:

ID1
301
5
ID2
157
18
4

3 回答 3

4

其他答案在正确的行上,但只是为了准确说明何时需要转换什么,以及括号需要去哪里。与 PHP 中的其他类型不同,SimpleXML 对象永远不会自动转换为float,因此数学运算符喜欢*将它们转换为int。(我将此作为一个错误提交,但由于 PHP 的内部没有实现它的方法,它被关闭了。)

因此,您需要在对其应用任何数学运算之前将SimpleXML 值转换为float(AKA double) 。为了在没有中间分配的情况下以正确的顺序强制执行此操作,您将需要一组额外的括号:.((float)$simplexml_value) * $some_number

然而,正如PHP 手册中的 Operator Precedence 表所示,类型转换(float)的优先级已经高于 , 优先*级高于.,因此下面的代码可以根据需要运行而无需任何额外的括号(多个 PHP 版本中的实时演示):

foreach ($xml->children() as $second_level) {
    echo $second_level->attributes()->id . "<br>";
    echo (float)$second_level->attributes()->width * 10 . "<br>";
    echo (float)$second_level->attributes()->height * 10 . "<br>";
}

在转换后立即分配给中间变量也可以,因为乘法更喜欢将integer10 转换为 afloat而不是将float变量转换为 a integer现场演示):

foreach ($xml->children() as $second_level) {
    echo $second_level->attributes()->id . "<br>";
    $width = (float)$second_level->attributes()->width;
    echo $width * 10 . "<br>";
    $height = (float)$second_level->attributes()->height;
    echo $height * 10 . "<br>";
}
于 2013-08-04T22:29:56.257 回答
2

那是因为10是一个数值,因此该等式的结果也将是一个整数值。您必须将所有值转换为floats

foreach ($xml->children() as $second_level) {
    echo $second_level->attributes()->id."<br>";
    echo (float) ((float) $second_level->attributes()->width * (float) 10)."<br>";
    echo (float) ((float) $second_level->attributes()->height * (float) 10)."<br>";
}

编辑:带有 php 5.4.16 的 Ubuntu 13.04 XAMPP,这有效:

<?php 
$xml = new SimpleXMLElement(
    '<DOM>
          <TAB id="ID1" width="30.1" height="0.5" ></TAB> 
          <TAB id="ID2" width="15.7" height="1.8" ></TAB>
    </DOM>');

foreach ($xml->children() as $second_level) {
    echo $second_level->attributes()->id."<br>";
    echo (float) ((float) $second_level->attributes()->width * 10)."<br>";
    echo (float) ((float) $second_level->attributes()->height * 10)."<br>";
}
于 2013-08-03T16:56:00.260 回答
2

通过此代码将值转换为双倍:

(double) ($second_level->attributes()->width) * 10
于 2013-08-03T16:58:42.360 回答