Метод XPATH для перенастройки нескольких динамических результатов из файла XML с использованием PHP

У меня есть форма, в которой пользователь вводит или выбирает значение, которое выглядит следующим образом

<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 из первого прохода XPATH является правильным, если все, что установлено, – «photographer_id», если я затем попробую $result = $xml->xpath('/root/area[photographer_id="' . $photographer_id . '"] | /root/area[photographer="' . $photographer . '"]'); и выберите 1 и fred тогда я получаю результат из массива всех четырех, когда он должен быть пустым массивом, может сообщить, как исправить эту ошибку. Извините, michi вот 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 будет больше, чем это.

У меня была проблема simillar с длинным сценарием, я взял идею оттуда и придумал это, я надеюсь, что это поможет

 <?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"]; } if(isset($_GET["images"])) { $image = $_GET["images"]; //$result = $xml->xpath('/root/area[photographer_id="' . $photographer_id . '"] and /root/area[photographer="' . $photographer . '"]'); 

}

 //echo $photographer_id; //echo $photographer; //echo $image; $filteredResult = array(); foreach($result as $obj){ if(in_array($photographer, (array)$obj) == 1 || $photographer == 'x'){ if(in_array($image, (array)$obj) || $image == 'x'){ array_push($filteredResult, $obj); } } } foreach($filteredResult as &$obj){ //how to access values in the object echo $obj->{'photographer'}; echo $obj->{'image'}; } echo $obj->{'image'}; ?> 

последнее эхо должно дать вам несколько указателей

Вот как это сделать:
(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

Не совсем уверен, чего вы хотите, так как ваш вопрос не совсем ясен. Тем не менее, я закодировал небольшой фрагмент, чтобы показать вам, как вы можете работать с условиями XPath, чтобы получить узлы area вы хотите получить для данного выбора в форме.

Просто подумайте о значениях в массиве $examples как возможные значения, представленные в форме.

 <?php $xml = <<<XML <?xml version="1.0" encoding="UTF-8"?> <root> <area> <photographer_id>1</photographer_id> <photographer>John</photographer> <image>a</image> </area> <area> <photographer_id>1</photographer_id> <photographer>John</photographer> <image>b</image> </area> <area> <photographer_id>1</photographer_id> <photographer>John</photographer> <image>c</image> </area> <area> <photographer_id>2</photographer_id> <photographer>Fred</photographer> <image>a</image> </area> </root> XML; $sxe = new SimpleXMLElement($xml); $examples = array( array('id' => 1, 'name' => 'John'), array('name' => 'Fred'), array('id' => 1, 'name' => 'Fred'), ); foreach ($examples as $example) { $conditions = array(); if (!empty($example['id'])) { $conditions[] = "photographer_id = {$example['id']}"; } if (!empty($example['name'])) { $conditions[] = "photographer = '{$example['name']}'"; } $xpath_condition = implode(' and ', $conditions); echo "{$xpath_condition}\n"; $area = $sxe->xpath("//area[{$xpath_condition}]"); print_r($area); } 

Вывод:

 photographer_id = 1 and photographer = 'John' Array ( [0] => SimpleXMLElement Object ( [photographer_id] => 1 [photographer] => John [image] => a ) [1] => SimpleXMLElement Object ( [photographer_id] => 1 [photographer] => John [image] => b ) [2] => SimpleXMLElement Object ( [photographer_id] => 1 [photographer] => John [image] => c ) ) photographer = 'Fred' Array ( [0] => SimpleXMLElement Object ( [photographer_id] => 2 [photographer] => Fred [image] => a ) ) photographer_id = 1 and photographer = 'Fred' Array ( )