1

私は非常に大きな XML を解析しており、これをガイドとして使用しています: http://www.php.net/manual/en/example.xml-structure.php。要素が読み取られるたびに増加するカウンターを実装し、最初の 10 個の要素を読み取った後に解析を停止したいと考えています。

私が試したコードは次のとおりです。

function startElement($parser, $name, $attrs) {
    if ($count == 10) {
        print_r($items);
        break; //this is not working, is exiting the script.
    }
}
4

1 に答える 1

0

原因

がのstartElementとして割り当てられているため、ハンドラはループ内で間接的に呼び出され続けます。start_element_handler$xml_parserstartElementwhile

xml_set_element_handler($xml_parser, "startElement", "endElement");
// code excluded for brevity
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        // code excluded for brevity
    }
}

解決

XML が非常に大きく、最初の要素だけに関心があるために全体の解析にサイクルを費やしたくない場合は、to を使用してループ$countからbreak抜け出すことができます。while

while ($data = fread($fp, 4096)) {
    if($count > 10) break;
    if(!xml_parse($xml_parser, $data, feof($fp))) {
        // code excluded for brevity
    }
}

追加情報

$items一度に 4096 バイトを読み取っているため、おそらく配列内に 10 個を超える項目が存在することになります。入力に応じて、その数をたとえば 2048 または 1024 バイトに減らすことができます。

可変範囲

関数に渡されない関数の外部でスコープを定義して使用する変数を使用している場合は、globalそれらの変数を使用する前にキーワードを使用する必要があります。たとえば、プログラムの先頭近くで定義し、ハンドラーでそれ$count = 0をインクリメントしたい場合、次のようになります。endElement

function endElement($parser, $name)  {
    global $count;
    $count++;
}

array_slice

$items次のように、配列の最初の 10 個の要素を除くすべてを取り除くことができます。

$output = array_slice($items, 0, 10);
于 2012-09-11T21:50:24.233 に答える