Фильтровать XML по элементам

<?php $files = glob( 'docs/*.xml' ); if ( isset( $_GET['doctype'] ) == "all" ) { foreach ( $files as $file ) { $xml = new SimpleXMLElement( $file, 0, true ); echo' <tr> <td id="'. $xml->doctype .'" name="'. $xml->doctype .'" class="mainTable">' . $xml->doctype . '</td> <td><a href="viewdoc.php?docname=' . basename( $file, '.xml' ) . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename( $file, '.xml' ) . '</a></td> <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> <td>'. $xml->date .'</td> <td>* * * * *</td> <td>'. filesize( $file ) .'kb</td> </tr> '; } } else if ( isset( $_GET['doctype'] ) == "doc" ) { foreach ( $files as $file ) { $xml = new SimpleXMLElement( $file, 0, true ); // code filter the $xml->doctype by equal it to currect value - which i'm not sure how to do. echo' <tr> <td id="'. $xml->doctype .'" name="'. $xml->doctype .'" class="mainTable">' . $xml->doctype . '</td> <td><a href="viewdoc.php?docname=' . basename( $file, '.xml' ) . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename( $file, '.xml' ) . '</a></td> <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> <td>'. $xml->date .'</td> <td>* * * * *</td> <td>'. filesize( $file ) .'kb</td> </tr> '; } } ?> 

У меня появилось несколько тегов <a> (такая же ссылка, home.php), каждая из них получила другую ссылку $ _GET ( home.php? Doctype = doc, home.php? Doctype = all и т. Д. ). Теперь я хочу отфильтровать каждый тип doctype с помощью инструкции if и проверить $_GET['doctype'] если он равен моему значению (при условии, что это значение – слово, excel, powerpoint и т. Д.).

Мой вопрос: как я могу фильтровать doctype, предполагая, что я равным $ xml-> doctype для одного из моих значений?

Solutions Collecting From Web of "Фильтровать XML по элементам"

я использовал бы битовую маску для этого: http://php.net/manual/en/language.operators.bitwise.php

 <?php // define your types and groups: $listedTypes["TYPE_MSWORD"] = 1; $listedTypes["TYPE_MSEXCEL"] = 2; $listedTypes["TYPE_MSPOWERPOINT"] = 4; $listedTypes["TYPE_OFFICE"] = $listedTypes["TYPE_MSWORD"] + $listedTypes["TYPE_MSEXCEL"] + $listedTypes["TYPE_MSPOWERPOINT"]; $listedTypes["TYPE_HTML"] = 8; $listedTypes["TYPE_SVG"] = 16; $listedTypes["TYPE_W3C"] = $listedTypes["TYPE_HTML"] + $listedTypes["TYPE_SVG"]; $listedTypes["TYPE_ALL"] = $listedTypes["TYPE_OFFICE"] + $listedTypes["TYPE_W3C"]; // try to open the page.php?doctype=TYPE_MSWORD // or page.php?doctype=TYPE_ALL if(!isset($_GET['doctype'])) $_GET['doctype'] = "TYPE_ALL"; if(!isset($listedTypes[$_GET['doctype']])) $_GET['doctype'] = "TYPE_ALL"; $requestedType = $listedTypes[$_GET['doctype']]; foreach ( $files as $file ) { $xml = new SimpleXMLElement( $file, 0, true ); if($xml->doctype == "......") $fileType = $listedTypes["TYPE_MSWORD"]; elseif($xml->doctype == ".........") $fileType = $listedTypes["TYPE_MSEXCEL"]; elseif($xml->doctype == ".........") $fileType = $listedTypes["TYPE_MSPOWERPOINT"]; //... continue // then check if the $type matches the $selection of $_GET['doctype'] // if the filetype is in the requested file type group, it will be shown if($fileType & $requestedType) { echo' <tr> <td id="'. $xml->doctype .'" name="'. $xml->doctype .'" class="mainTable">' . $xml->doctype . '</td> <td><a href="viewdoc.php?docname=' . basename( $file, '.xml' ) . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename( $file, '.xml' ) . '</a></td> <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> <td>'. $xml->date .'</td> <td>* * * * *</td> <td>'. filesize( $file ) .'kb</td> </tr> '; } } 

Ваша проблема связана с IF:

if ( isset( $_GET['doctype'] ) == "all" )

этот оператор будет оценивать логический результат isset()'s true или false со string "all" и вы, вероятно, не имели в виду, что

Чтобы исправить это, а также избавиться от избыточности, используйте этот код:

 $acceptedDocTypes = ['all', 'doc', 'excel']; if ((isset($_GET['doctype'])) && (in_array($_GET['doctype'], $acceptedDocTypes))) { foreach ( $files as $file ) { $xml = new SimpleXMLElement( $file, 0, true ); echo' <tr> <td id="'. $xml->doctype .'" name="'. $xml->doctype .'" class="mainTable">' . $xml->doctype . '</td> <td><a href="viewdoc.php?docname=' . basename( $file, '.xml' ) . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename( $file, '.xml' ) . '</a></td> <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td> <td>'. $xml->date .'</td> <td>* * * * *</td> <td>'. filesize( $file ) .'kb</td> </tr> '; } } 

До тех пор, пока 'doctype' установлен «И» из разрешенных типов, этот код будет фильтроваться им.