1

次のコードを使用して、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 を示す 2 行は、XML からの除外について foreach ループから値を除外する別の投稿を見た後に追加しましたが、ページを読み込むと、PIN が指定された 2 つのレコードがまだ表示されています。

これは、XML ファイルから特定のレコードをプルすることを除外する正しい方法ですか?

どんな助けでも大歓迎です!

編集: 入力された 4 桁の数字は、Reader->PIN で見つかった PIN 番号です。考えてみると、番号と xml ファイルの Reader->PIN の間のリンクが作成されていない可能性がありますか?

4

3 に答える 3

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'; 
}
于 2014-04-03T14:03:17.743 に答える
0

別の方法は、最初の foreach ループでそれらを除外することです。

foreach($xml as $Reader) {
    if (array_search($Reader->Pin, $exclude) === FALSE) {
         $items[] = $Reader;
    }
}

いずれの場合も、以下は必要ありません。

$items = array_diff($items, $exclude);

array_diff() は、2 番目の配列 ($exclude) に存在しない最初の配列 ($items) の値を返します。あなたの場合、最初の配列は空の配列であるため、値がないため、 array_diff() も常に空の配列を返します。

おそらく、誰かが XPath ソリューションを提供するでしょう。それは別のアプローチです。(編集 - ああ、@ pp19dd がこれを提供したようです。)

于 2014-04-03T14:16:22.240 に答える