2014-01-28 2 views
0

Проект, над которым я работаю, имеет меня в конце моего ума. Я новичок в кодировании на PHP, который, я уверен, будет довольно очевидным из моего вопроса. У меня есть XML-файл с несколькими элементами элементов, которые я перечисляю в таблице. В конце таблицы у меня есть еще одна строка, отображающая общий вес. Если все веса являются целыми числами, он отлично работает. Проблема, с которой я сталкиваюсь, заключается в том, что если какой-либо из моих весов элементов имеет десятичные числа в них, они, похоже, исчезают во время вычисления. Ниже приведен пример инструкции foreach, которую я запускаю.Как я могу предотвратить выражение foreach от удаления десятичных знаков?

foreach ($xml->items->item as $item) { 
$ItemWeight = (($item->weight) * ($item->quantity)) + $ItemWeight; 
} 

И выдержка из XML-документа.

<items> 
    <item> 
     <name>Sleeping Bag</name> 
     <weight>5</weight> 
     <quantity>1</quantity> 
    </item> 
    <item> 
     <name>Clothes</name> 
     <weight>2.5</weight> 
     <quantity>5</quantity> 
    </item> 
    <item> 
     <name>Socks</name> 
     <weight>.5</weight> 
     <quantity>10</quantity> 
    </item> 
    <item> 
     <name>MRE</name> 
     <weight>1</weight> 
     <quantity>5</quantity> 
    </item> 
</item> 

В моем примере Clothes будет рассчитываться по общему весу 10 вместо 12,5 и Socks бы полностью исчезнуть. $ItemWeight выход будет равен 20 вместо 27.5.

+0

Где входные данные? – sectus

+0

Прошу прощения, если я идиот, но что вы понимаете под входными данными? – garnernw

+0

Что такое значение '$ item-> weight'? – sectus

ответ

0

Вы должны попытаться отладить код, проверив значения отдельного узла. Вы можете попробовать следующий фрагмент кода, который получает правильное значение 27.5.

Здесь я преобразовал xml в массив, который не требуется. Это было просто быстрое и грязное решение. Вы можете видеть, что нет проблем с foreach. Я считаю, что ценности, которые вы проходите, ошибочны.

$xmlstring = ' 
<items> 
    <item> 
     <name>Sleeping Bag</name> 
     <weight>5</weight> 
     <quantity>1</quantity> 
    </item> 
    <item> 
     <name>Clothes</name> 
     <weight>2.5</weight> 
     <quantity>5</quantity> 
    </item> 
    <item> 
     <name>Socks</name> 
     <weight>.5</weight> 
     <quantity>10</quantity> 
    </item> 
    <item> 
     <name>MRE</name> 
     <weight>1</weight> 
     <quantity>5</quantity> 
    </item> 
</items>'; 


$xml = simplexml_load_string($xmlstring); 
$json = json_encode($xml); 
$items = json_decode($json,FALSE); 
$ItemWeight=0; 
foreach ($items->item as $item) { 
$ItemWeight = (($item->weight) * ($item->quantity)) + $ItemWeight; 
echo $ItemWeight."\n"; 
} 
+0

Итак, ваш ответ заставил меня копать, и я думаю, что понял суть проблемы. Когда я загружаю XML, он загружает его в виде строки, а затем, когда я начинаю делать с ним вычисления, он преобразует его в целое и делит на десятичную. Итак, я думаю, новый вопрос, как загрузить XML-документ как нечто отличное от строки? – garnernw

+0

Проблема заключается не в том, что вы загружаете XML в строку. Проблема в том, что вы не конвертируете строку в нужный тип. Вы должны извлечь желаемый тип, используя функцию floatval(), которая сохранит фракцию, которую вы теряете из-за округления. –

0

Попробуйте использовать floatval()

Таким образом, ваш цикл Еогеасп будет выглядеть следующим образом:

foreach ($xml->item as $item) { 
    $weight = floatval(($item->weight)); 
    $quantity = floatval(($item->quantity)); 
    $ItemWeight = ($weight * $quantity); 
    echo $ItemWeight."\n"; 
Смежные вопросы