1

次の xml (スニペット) の各項目のオプション ノードの最大値と最小値を取得しようとしています。

<body>
    <page number="1">
        <itemset name="a">
            <item id="1">
               <option value="0">no</option>
               <option value="1">rarely</option>
               <option value="3">sometimes</option>
               <option value="5">often</option>
               <scale id="ho" />
            </item>
            <item id="2">
                <option value="0">no</option>
                <option value="1">rarely</option>
                <option value="3">sometimes</option>
                <option value="5">often</option>
                <scale id="hi" />
            </item>
        </itemset>
    </page>
</body>

私はこれをforeachループ内で行っています...

...

$scid="ho";
$total=0;
$count=0;

foreach ($txml->xpath("//item[scale/@id='$scid']") as $item) {
    $score=$rxml->xpath("//item[@id='".$item['id']."']"); // get a value from another simple_xml-object
$total+=intval($score[0]);
$count++;
// ******* problem starts here...           
$values = $item->option['value'];
// doing sth with $values to get max and min value
    echo '<pre>'; 
    print_r($values); // ******* 
    echo '</pre>';
} // foreach $item

...

私が入るの$values

SimpleXMLElement Object
(
    [0] => 0
)

代わりに$values = $item->xpath('option[@value]');、私は...

    Array
(
    [0] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 0
            )

    )

    [1] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 1
            )

    )

    [2] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 3
            )

    )

    [3] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 5
            )

    )

)

より簡単な解決策、またはそこから最小値と最大値を取得する方法を探しています。

私はsth likeを取得したいと思い$values['max']=5ます$values['min']=0

前もって感謝します、

ミチ

PS: simple_xml でこれを機能させることができず、DOM に切り替えたくなかったので、いくつかの基本的な PHP を使用して手早く行うことにしました。

foreach ($item->xpath("//item[@id='".$item['id']."']/option/@value") as $value) {
    $v[]=(int)$value->value;
}
echo max($v);
echo min($v);
4

1 に答える 1

0

この投稿の助けを借りて、次の例が機能するようになりました。

$doc = new DOMDocument();
@$doc->loadHTML($htmlcontent);

$selector = new DOMXPath($doc);

// get max value of item with id 1
$result = $selector->query('//item[@id=1]/option[not(preceding-sibling::option/@value >= @value) and not(following-sibling::option/@value > @value)]/@value');

if(!$result || $result->length < 1) {
    die('error');
}
foreach($result as $item) {
    echo 'max: ', $result->item(0)->value, PHP_EOL;
}


// get min value of item with id 1
$result = $selector->query('//item[@id=1]/option[not(preceding-sibling::option/@value <= @value) and not(following-sibling::option/@value < @value)]/@value');

if(!$result || $result->length < 1) {
    die('error');
}
foreach($result as $item) {
    echo 'min: ' . $result->item(0)->value, PHP_EOL;
}
于 2013-02-08T21:21:54.433 に答える