簡體   English   中英

緩沖或移動PHP數據以顯示在網頁的不同部分

[英]Buffering or moving PHP data to display in a different part of a webpage

我正在使用XMLReader解析非常大的XML文件。

$reader = new XMLReader;
$reader->open('products.xml');
$dom = new DOMDocument;
$xpath = new DOMXpath($dom);

while ($reader->read() && $reader->name !== 'product') {
continue;
}

while循環用於根據用戶輸入顯示相關數據,以及使用XML值構建數組。

while ($reader->name === 'product') {
$node = $dom->importNode($reader->expand(), TRUE);

if ($xpath->evaluate('number(price)', $node) > $price_submitted) {

$category = $xpath->evaluate('string(@category)', $node);
$name = $xpath->evaluate('string(name)', $node);
$price = $xpath->evaluate('number(price)', $node);

// Relevant search results displayed here:
echo "Category: " . $category . ". ";
echo "Name: " . $name . ". ";
echo "Price: " . $price . ". ";


$nameArray[] = $name;

}
$reader->next('product');
}

下面的foreach循環使用上面的while循環中構建的數組。 我需要這些值(顯示在下面的此foreach循環中)才能在上面的while循環顯示相關搜索結果之前顯示。 使用XMLReader,每次解析XML時只能執行一次while循環,由於內存和開銷問題,我不想將其解析兩次。 做這個的最好方式是什么?

foreach ($nameArray as $names) {
echo $names . " "; 
}

好吧...沒有太多選擇。 最有效的直接方法是將類別/名稱/價格存儲在數組中,而不是直接輸出它們:

<?php
$data = array();
while ($reader->name === 'product') {
    $node = $dom->importNode($reader->expand(), TRUE);

    if ($xpath->evaluate('number(price)', $node) > $price_submitted) {
        $category = $xpath->evaluate('string(@category)', $node);
        $name = $xpath->evaluate('string(name)', $node);
        $price = $xpath->evaluate('number(price)', $node);

        $data[] = array($category, $name, $price);
        $nameArray[] = $name;
    }

    $reader->next('product');
}

foreach ($nameArray as $names) {
    echo $names . " "; 
}

foreach ($data as $datum) {
    // Relevant search results displayed here:
    echo "Category: " . $datum[0] . ". ";
    echo "Name: " . $datum[1] . ". ";
    echo "Price: " . $datum[2] . ". ";
}

如果在內存方面無法正常工作(您提到XML文件很大),則應使用db或文件支持的臨時存儲

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM