-2

ユーザーが値を入力または選択するフォームがあります。フォームは次のとおりです

<form id="search_photos" action="photo_result.php" method="get">
<select name="Photographer_id" id="Photographer_id"   style="height:23px; border:1px solid Silver;">
    <option selected="selected" value="x">Any Photographer_id</option>
    <option value="John">John</option>
    <option value="Fred">Fred</option>
    <option value="Joseph">Joseph</option>
</select>
<select name="Photographer_id" id="Photographer_id"   style="height:23px; border:1px solid Silver;">
    <option selected="selected" value="x">Any Photographer_id</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<select name="images" id="images"   style="height:23px; border:1px solid Silver;">
    <option selected="selected" value="x">All Images</option>
    <option value="0">None</option>
    <option value="a">Image a</option>
    <option value="b">Image b </option>
    <option value="c">Image c </option>
</select>
    <select name="images_id" id="images_id"   style="height:23px; border:1px solid Silver;">
    <option selected="selected" value="x">All Images</option>
    <option value="0">None</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<input name="Submit" value="Search Now &gt;" id="Submit" class="Adv1_Filter_Button" type="submit">

次に、search_photo.phpフォームの結果をキャッチし、ユーザーが入力した値を次のようにフィルター処理するスクリプト

$xml = simplexml_load_file("photo.xml");

for ($i = 0; $i < count($xml); $i++) {  

    if (isset($_GET["LocationName"])) {
        $photographer_id = $_GET["LocationName"];
    }

    $result = $xml->xpath('/root/area[photographer_id="' . $photographer_id . '"]  ');
}

if(isset($_GET["Photographer"])) {
    $photographer = $_GET["Photographer"];
} 

$result = $xml->xpath('/root/area[photographer_id="' . $photographer_id . '"]  ');

if(isset($_GET["images"])) {
    $image = $_GET["images"];
}

echo $photographer_id;
echo $photographer;
echo $image;
var_dump ($result);

$result設定されているすべてが 'photographer_id' である場合、最初の XPATH パスからは正しいです。次に試して$result = $xml->xpath('/root/area[photographer_id="' . $photographer_id . '"] | /root/area[photographer="' . $photographer . '"]'); 選択する1fred、4 つすべての配列の結果が得られますが、空の配列である必要がある場合、このエラーを修正する方法をアドバイスできます。申し訳ありませんが、ここにXMLファイルがあります

 <?xml version="1.0" encoding="UTF-8"?>
  <root>
   <area>
    <photographer_id>1</photographer_id>
    <photographer>John</photographer>
    <image>a</image>
    <image_id>1</image_id>
   </area>
   <area>
    <photographer_id>1</photographer_id>
    <photographer>John</photographer>
    <image>b</image>
    <image_id>2</image_id>
   </area>
   <area>
    <photographer_id>1</photographer_id>
    <photographer>John</photographer>
    <image>c</image>
    <image_id>3</image_id>
   </area>
   <area>
    <photographer_id>2</photographer_id>
    <photographer>Fred</photographer>
    <image>a</image>
    <image_id>4</image_id>
   </area>
   <area>
    <photographer_id>3</photographer_id>
    <photographer>Joseph</photographer>
    <image>a</image>
    <image_id>5</image_id>
   </area>
  </root>

これは役に立ちますが、最終的な XML ファイルはこれよりも大きくなります。

4

3 に答える 3

1

これを行う方法は次のとおりです。
(1)フォームからフィルター値を取得し、xpath のクエリ文字列を作成します。

$fields = array( // fieldname => value for "all"
    'photographer_id' => '',
    'photographer' => 'x',
    'image' => '0');

foreach ($fields as $fieldname => $fieldvalue)
    if (isset($_GET[$fieldname]) && trim($_GET[$fieldname]) != $fieldvalue)
    $query[] = "$fieldname = '$_GET[$fieldname]'";

if (isset($query)) 
    $query = "[" . implode(' or ', $query) . "]"; else $query = "";

(2) xpath を使用して XML をフィルタリングし、選択したノードを表示する

$xml = simplexml_load_string($x); // assume XML in $x
$results = $xml->xpath("area$query");

foreach ($results as $result) 
    echo "image $result->image by $result->photographer ($result->photographer_id)<br />";

動作を確認してください: http://codepad.viper-7.com/ciboJg

于 2013-05-19T16:20:37.187 に答える