找不到合适的方法来执行以下操作:我有xml,其中包含每个元素都具有属性顺序且值范围为0-3的元素。它们按该属性(0,1,2,3,0,1,2,3 ...)排序并且是兄弟姐妹。许多元素可以变化,并且文档中的第一个元素不必以0开始,因为XML每4小时刷新一次并且每次刷新时当前第一个元素都被删除而下一个元素被删除在第一个位置上排队的元素。例如:在凌晨0:00,第一个元素具有属性order =" 0"。在6:00它被删除,下一个兄弟带他的(第一)地方属性顺序=" 1"。
我想为一组元素做一个循环,它们从0到3排序(第一个元素可能有0,1,2或3的第一个组除外)并检索最低和最高值每个组子节点。例如:
$('figure').each( function() {
var thumb = $(this).find('.thumbnail');
var image = $(this).find('a').attr('href');
$(thumb).css('background-image', 'url(' + image + ')');
});
希望这个问题不被广泛质疑。这些注释不包含在XML中。
答案 0 :(得分:2)
这是一种方式。
此解决方案仅在订购属性时有效,例如1, 3, 4
而不是{} 3, 0, 4
。
$string = <<<XML
<!-- XML data goes here -->
XML;
// suppress some errors
libxml_use_internal_errors(true);
$xml = simplexml_load_string($string);
// step 1: group all the values
// keep track of the previous order to determine when we have a new group
// INF is just an arbitrarily large number to start the first group
$prevOrder = INF;
$groups = [];
$i = -1;
foreach ($xml->element as $element) {
$order = (int) $element->attributes()['order'];
// start a new group if the current order is smaller than the previous order
if ($order <= $prevOrder) {
$groups[++$i] = [];
}
// store the next values in that group
foreach ($element->node as $node) {
$groups[$i][] = (int) $node->attributes()['value'];
}
$prevOrder = $order;
}
// step 2: get the minimum and maximum of each group
foreach ($groups as $group) {
printf('%d, %d<br>', min($group), max($group));
}