1

PHPとXpathを使用して、ドキュメントをいくつかの異なる値で解析しています。Xpath クエリの結果/一致を配列に投げています。たとえば、次の$prices arrayようにビルドします。

$prices = array();
$result = $xpath->query("//div[@class='the-price']");
foreach ($result as $object) {
$prices[] = $object->nodeValue; }

配列を作成したら、次のようにループして値を HTML にスローします。

$i = 0;
foreach ($links as $link) {
    echo <<<EOF
<div class="the-product">
    <div class="the-name"><a title="{$names[$i]}" href="{$link}" target="blank">{$names[$i]}</a></div>
    <br />
    <div class="the-image"><a title="{$names[$i]}" href="{$link}" target="blank"><img src="{$images[$i]}" /></a></div>
    <br />
    <div class="the-current-price">Price is: <br> {$prices[$i]}</div>
</div>
EOF;
    $i++; }

問題は、私が解析している元のドキュメントの一部のアイテムに価格<div class='the-price'>がないことです. $prices array。_ 最終的に20 個の製品と、 17個のキー/値のみを含む配列が返さNotice: Undefined offsetれ、いたるところでエラーが発生します。

私の質問は、キー値が欠落していて、配列を破棄しているアイテムをどのように説明できますか? これらの項目の配列にダミーの値を挿入できますか? 私は考えられる限り多くの異なる解決策を試しました。主に、foreach ループ内の IF ステートメントですが、何も機能していないようです。

ありがとうございました

4

4 に答える 4

0

「価格」ループに常に存在する html 内の要素を探すことをお勧めします。このオブジェクトを見つけたら、「価格」要素を探し始めます。何もない場合は、空の文字列などを配列に挿入します。

于 2012-07-16T19:45:07.743 に答える
0

the-price要素を直接探すのではなく、含まれている を探しますthe-product。それらをループし、それらのノードを開始コンテキストとして使用してサブクエリを実行します。そうすれば、すべてのthe-productノードに加えて、それらを持つノードの価格を取得できます。

例えば

$products = array();
$products = $xpath->query("//div[@class='the-product']");
$found = 0 ;
foreach ($products as $product) {
   $products[$found] = array();
   $price = $xpath->query("//div[@class='the-price']", $product);
   if ($price->length > 0) {
       $products[$found] = $price->item(0)->nodeValue;
   }
   $found++;
}
于 2012-07-16T19:46:23.263 に答える
0

価格が添付されていない製品を表示したくない場合は、$prices[$i]最初に が設定されているかどうかを確認できます。

foreach($links AS $link){
    if(isset($prices[$i])){
        // echo content
    }
}

または、それを埋めたい場合は、ダミーの値を言うことができます

$prices = array_merge($prices,
              array_fill(count($prices), count($links)-count($prices),0));

そして、それは0残りの値のダミー値として挿入されます。array_fill配列の最初のインデックスを取得することから始めます (したがって、 のキーの量の後に 1 を開始します$prices)。次に、入力する必要がある数$pricesです$links。ダミー値 0。

または、最初の例で同じロジックを使用して、次のように適用することもできます。

echo isset($prices[$i]) ? $prices[$i] : '0';
于 2012-07-16T19:47:43.170 に答える
0

示されているコードでは $links と $prices の関係を理解するのは困難です。$links 配列とは関係なく $prices 配列を構築しているため、これをどのように行うかわかりません。

$links も xpath 経由でビルドされますか? もしそうなら、'the-price' div は常に $links を設定するために使用される DOM 要素内にネストされていますか?

その場合は、xpath クエリをネストして、リンクの検索に使用されるクエリ内で価格を検索し、カウンターを使用して 2 つを一致させることができます。

すなわち

$links_result = $xpath->query('path-to-link')
$i = 0
foreach ($links_result as $link_object) {
    $links[$i] = $link_object->nodeValue;
    // pass $link_object as context reference to xpath query looking for price
    $price_result = $xpath->query('path-to-price-within-link-node', $link_object);
    if (false !== $price_result) {
        $prices[$i] = $price_result->nodeValue;
    } else {
        $prices[$i] = 0; // or whatever value you want to show to indicate that no price was available.
    }
    $i++;
}

明らかに、リンク ノードごとに 1 つの価格値のみが存在することなどを確認する追加の処理が存在する可能性がありますが、それは基本的な考え方です。

于 2012-07-16T19:58:30.933 に答える