Добавление определенных значений XML-канала вместе с последующим выводом - PullRequest
0 голосов
/ 08 декабря 2011

Привет, интересно, кто-нибудь может мне помочь.

первый приведенный ниже код в основном подсчитывал каждую запись XML и выводил в нужном формате

Старый код

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://xxxxx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml_string = curl_exec ($ch);
curl_close ($ch);

// parse data
$xml=simplexml_load_string($xml_string);

// fix to n slots, zero padded
$slots=6;
$counter = substr((string)(pow(10,$slots)+count($xml)),1,$slots);

for($c=0; $c<strlen($counter); $c++)
{
    echo("<span>".$counter[$c]."</span>");
}

Outположить

<span>1</span><span>3</span><span>5</span><span>6</span><span>8</span><span>8</span>

все было в порядке, но теперь XML-канал изменился и просто выводит следующее.

<Data>
    <Row>
        <Column name="cam" type="xs:int">000</Column>
        <Column name="camN" type="xs:string">hello</Column>
        <Column name="numer" type="xs:int">1</Column>
    </Row>
    <Row>
        <Column name="cam" type="xs:int">000</Column>
        <Column name="camN" type="xs:string">hello</Column>
        <Column name="numer" type="xs:int">985</Column>
    </Row>
    <Row>
        <Column name="cam" type="xs:int">000</Column>
        <Column name="camN" type="xs:string">hello</Column>
        <Column name="numer" type="xs:int">1</Column>
    </Row>      
</Data>

мне нужен тот же вывод, но я не уверен, как мне поступитьчисловое значение из каждой записи + их вместе, а затем вывести их, убедившись, что у меня есть 6 символов, даже если оно заканчивается 000005 как значение

Приветствия

Обновление


извините, мне нужно добавить числовые значения вместе, чтобы получить тотел, так что если тотел равен 987, мне нужно вывести его:

<span>0</span><span>0</span><span>0</span><span>9</span><span>8</span><span>7</span>

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

SimpleXml - самый простой способ сделать это. Учитывая ваш предоставленный XML:

$xml = '
<Data>
    <Row>
        <Column name="cam" type="xs:int">000</Column>
        <Column name="camN" type="xs:string">hello</Column>
        <Column name="numer" type="xs:int">5220</Column>
    </Row>
    <Row>
        <Column name="cam" type="xs:int">000</Column>
        <Column name="camN" type="xs:string">hello</Column>
        <Column name="numer" type="xs:int">4220</Column>
    </Row>
    <Row>
        <Column name="cam" type="xs:int">000</Column>
        <Column name="camN" type="xs:string">hello</Column>
        <Column name="numer" type="xs:int">3220</Column>
    </Row>      
</Data>
';

$xml = simplexml_load_string($xml);
$numer_sum = 0;

// sums the value of columns
foreach ($xml->Row as $row) {
  $numer_sum += (int)$row->Column[2];
}

В качестве альтернативы, вы можете использовать xpath, чтобы убедиться, что вы всегда суммируете элементы Column с name = "numer", даже если меняется порядок столбцов xml:

$xml = simplexml_load_string($xml);

// get only the column elements with name="numer"
$xpath_result = $xml->xpath('Row/Column[@name="numer"]');
$sum = 0;

foreach ($xpath_result as $numer) {
  $sum += (int)$numer[0];
}

echo $sum;
1 голос
/ 08 декабря 2011

Вы можете использовать xpath для захвата нужных вам узлов, например, так:

$xml = simplexml_load_string( $xml);
$elements = $xml->xpath( "/Data/Row/Column[@name='numer']");
$sum = 0;
foreach( $elements as $el)
{
    $sum += $el[0];
}
echo $sum; // Prints 12660

Теперь, чтобы получить желаемый результат, заполните число нулями, разбейте его на куски по 1 символу и выведитеэто, вот так:

$formatted = sprintf('%06d', $sum);
echo '<span>' . implode( '</span><span>', str_split( $formatted)) . '</span>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...