Используя 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
Другие ответы находятся на правильных строках, но просто для того, чтобы точно определить, что нужно делать, когда, и, следовательно, в скобках нужно идти. В отличие от других типов в PHP, объекты SimpleXML никогда не автоматически переносятся в float
, поэтому математические операторы, такие как *
вместо этого используют их вместо int
. (Я зарегистрировал это как ошибку , но он был закрыт на том основании, что внутренности PHP не имеют возможности реализовать его.)
Поэтому вам необходимо передать значение SimpleXML в float
(AKA double
), прежде чем применять к нему какие-либо математические операции. Чтобы заставить это в правильном порядке без промежуточного присвоения, вам понадобится ровно один набор дополнительных круглых скобок: ((float)$simplexml_value) * $some_number
.
Однако, как показывает таблица приоритетов оператора в руководстве PHP , типы приведения, такие как (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>"; }
Присвоение промежуточной переменной сразу же после кастинга также будет работать, поскольку умножение предпочтет преобразовать integer
10 в float
чем преобразовать переменную float
в 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>"; }
Это потому, что 10
– целочисленное значение, поэтому результатом этого уравнения будет также целочисленное значение. Вы должны использовать все значения для float .
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>"; }
EDIT: Ubuntu 13.04 XAMPP с php 5.4.16, это сработало:
<?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>"; }
Переместите значения, чтобы удвоить этот код:
(double) ($second_level->attributes()->width) * 10