I have a working php script that goes through a huge file and pulls out specific movie titles and ratings. But now my assignment is to "sort" them so the movie titles with the 'xxx' are listed at the bottom. I've looked into usort, but with the script I already have written, would that be the best way to go? Or is there a simpler way?

PHP SCRIPT:

<?php

foreach (glob("*.mov") as $filename)

$theData = file_get_contents($filename) or die("Unable to retrieve file data");

$months = ['January' => '_01', 'February' =>  '_02', 'March' => '_03', 'April' => '_04', 'May' => '_05', 'June' => '_06', 'July' => '_07', 'August' => '_08', 'September' => '_09', 'October' => '_10', 'November' => '_11', 'December' => '_12'];

foreach($months as $key => $month){
  if(strpos($filename,$month)!==false){
        echo "<div style ='text-shadow: 0 1px 0 #222222; margin-left: 5%; margin-top: 20px; margin-bottom: 10px; font:18px Verdana,tahoma,sans-serif;
                color:#218555; font-weight:bold;'>- Movie List for $key 2013 -</div>";

    }
}


$string = $theData;
$titles = explode("\n", $string);

function getInfo($string){
    $Ratings = ['G', 'PG', 'PG-13', 'R', 'NR', 'XXX'];
    $split = preg_split("/\"(.+)\"/", $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
    if(count($split) == 3){ 
        preg_match("/(".implode("|", $Ratings).")\s/", $split[0], $matches);
        $rating = $matches[0];
        return ["title" => $split[1], "rating" => $rating];
    }
    return false;
}

foreach($titles as $title){
    $info = getInfo($title);
    if($info !== false){
        echo "<div style ='margin-left:5%; margin-bottom: 3px; 
                font:14px Verdana,tahoma,sans-serif;color:green;'>
                 {$info["title"]} : {$info["rating"]}</div>";
    }
}
?>

OUTPUTS:

- Movie List for May 2013 -
(HD) Identity Thief : PG-13
(HD) Escape from Planet Earth : PG
(HD) Dark Skies : PG-13
(HD) The Guilt Trip : PG-13
(HD) Jack Reacher : PG-13
(HD) Les Miserables : PG-13
(HD) Mama : PG-13
(HD) Safe Haven : PG-13
(HD) A Place at the Table : PG
(HD) Cirque du Soleil: Worlds Away : PG
(HD) Rise of the Guardians : PG
(HD) Fun Size : PG-13
(HD) Shanghai Calling : PG-13
(HD) The Package : NR
(HD) The House at the End of the Street : PG-13
Beautiful Creatures : PG-13
The Incredible Burt Wonderstone : PG-13
Jack the Giant Slayer : PG-13
Parental Guidance : PG
The Hobbit: An Unexpected Journey : PG-13
Cloud Atlas : PG-13
Life of Pi : PG
Chasing Mavericks : PG
Taken 2 : PG-13
Adult title 1 : XXX
Fat Burning Hip Hop Dance Party : G
Fat Burning Hip Hop Dance Grooves : G
Aladdin : G
Americano : NR
Missing Brendan : NR
Point Doom : NR
Gullivers Travels : G
The Little Princess : PG
Jack And The Beanstalk : PG
To the Arctic : G
Adult title 2 : XXX

Need to get the titles with XXX to sort to the bottom.

有帮助吗?

解决方案

I would suggest you first build up a list of the info details like this:

$infolist = array();
foreach($titles as $title){
    $info = getInfo($title);
    if($info !== false){
        $infolist[] = $info;
    }
}

Then you can easily sort that list with usort since the rating is now easily accessible:

usort($infolist, "infosort");

function infosort($lhs,$rhs) {
  return strcmp($lhs['rating'], $rhs['rating']);
}

And finally you can write out the sorted results from the infolist array:

foreach ($infolist as $info) {
  echo "<div style ='margin-left:5%; margin-bottom: 3px;
          font:14px Verdana,tahoma,sans-serif;color:green;'> 
           {$info["title"]} : {$info["rating"]}</div>";
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top