PHP читает десятичные целые числа из атрибутов xml

Используя 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