原因
由于startElement
被分配为 的start_element_handler
,$xml_parser
处理startElement
程序不断在while
循环中被间接调用:
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 非常大,并且您不想花费循环解析整个内容,因为您只对开始时的元素感兴趣,您可以使用$count
to 来break
退出while
循环:
while ($data = fread($fp, 4096)) {
if($count > 10) break;
if(!xml_parse($xml_parser, $data, feof($fp))) {
// code excluded for brevity
}
}
附加信息
因为您一次读取 4096 个字节,所以您的$items
数组中可能最终会包含 10 多个项目。您可以根据您的输入将该数字减少到 2048 或 1024 个字节。
变量范围
如果您使用定义的变量并使用未传递给它的函数之外的范围,则必须global
在使用这些变量之前使用关键字。例如,如果您$count = 0
在程序开头附近定义并希望在endElement
处理程序中增加它,它应该看起来像这样:
function endElement($parser, $name) {
global $count;
$count++;
}
array_slice
您可以像这样摆脱$items
数组的前 10 个元素以外的所有元素:
$output = array_slice($items, 0, 10);