Filter XML by elements [duplicate]

2019-03-07 00:55发布

问题:

This question already has an answer here:

  • Split foreach to pages 2 answers
<?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>
               ';
        }
    }
?>

I got few <a> tags (same link, home.php), each one got different $_GET link (home.php?doctype=doc, home.php?doctype=all, etc..). Now i wish to filter each doctype by using if statement and check $_GET['doctype'] if he equals to my value (assuming the value is word, excel, powerpoint, etc..).

My question is: how can I filter doctype assuming that I equal $xml->doctype to one of my values?

回答1:

i would use a bitmask for this: 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>
        ';
    }
}


回答2:

Your problem is with the IF:

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

this statement will evaluate isset()'s boolean result true or false with string "all" and you probably didn't mean that

To fix this and also get rid of redundancy use this code:

$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>
                ';
    }
}

So as long as 'doctype' is set AND is of the types allowed, this code will filter by it.