我使用以下代码从XML文件中提取数据:
<?php
$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$items = array();
$exclude = array('4419','4373');
$items = array_diff($items, $exclude);
foreach($xml as $Reader) {
$items[] = $Reader;
}
usort ($items, function($a, $b) {
return strcmp($a->Status,$b->Status);
});
foreach($items as $Reader) {
if($Reader->Status != 'Logged Off' && $Reader->Picture != 'None')
{
include '/extras/reader-single.php';
}
}
?>
两行显示$ exclude和$ items我已经添加了关于从XML中排除的另一篇帖子excluding values from a foreach loop,但是当我加载页面时......指定了PIN的两条记录仍在显示
这是排除从XML文件中提取某些记录的正确方法吗?
非常感谢任何帮助!
编辑:输入的四位数字是在Reader-&gt; PIN处找到的PIN码 想一想,它是不是在xml文件上的数字和Reader-&gt; PIN之间建立了链接?
答案 0 :(得分:1)
有一种更简单的方法可以专门查询属性 - 或排除它们。
$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$matches = $xml->xpath( "//Reader[Pin!=4419 and Pin!=4373]" );
这将为您提供整个结构,减去两个项目#4419和#4373。
答案 1 :(得分:0)
正如我在评论中所说,获取每条记录的引脚,将其与排除数组进行比较,如果它是排除数组的一部分,则继续循环。像这样:
$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$items = array();
$exclude = array('4419','4373');
$items = array_diff($items, $exclude);
foreach($xml as $Reader) {
$items[] = $Reader;
}
usort ($items, function($a, $b) {
return strcmp($a->Status,$b->Status);
});
foreach($xml as $Reader) {
if($Reader->Status != 'Logged Off'
&& $Reader->Picture != 'None'
// check if the Pin is in exclude array
&& !in_array($Reader->Pin, $exclude)
) {
include '/extras/reader-single.php';
}
}
或者您可以使用array_filter()
:
$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$items = array();
$exclude = array('4419','4373');
$items = array_diff($items, $exclude);
foreach($xml as $Reader) {
$items[] = $Reader;
}
$items= array_filter($items, function($Reader) use ($exclude) {
if($Reader->Status == 'Logged Off'
|| $Reader->Picture == 'None'
|| in_array($Reader->Pin, $exclude)
) {
return false;
}
return true;
});
usort ($items, function($a, $b) {
return strcmp($a->Status,$b->Status);
});
foreach($items as $Reader) {
include '/extras/reader-single.php';
}
答案 2 :(得分:0)
另一种方法是在第一个foreach循环中过滤掉它们:
foreach($xml as $Reader) {
if (array_search($Reader->Pin, $exclude) === FALSE) {
$items[] = $Reader;
}
}
在任何一种情况下,您都不需要:
$items = array_diff($items, $exclude);
array_diff()返回第一个数组($ items)中第二个数组中不存在的值($ exclude)。因为在你的情况下第一个数组是一个空数组,它没有值,所以array_diff()也总是返回一个空数组。
也许有人会提出XPath解决方案 - 这将是另一种方法。 (编辑 - 啊,我看到@ pp19dd提供了这个。)