在这个我的PHP脚本的场景中,usort是最好的吗?

时间:2013-06-03 19:22:47

标签: php arrays sorting usort

我有一个工作的PHP脚本,通过一个巨大的文件,并提取特定的电影标题和评级。但现在我的任务是“排序”他们,所以带有'xxx'的电影标题列在底部。我已经调查了usort,但是我已经编写了这个脚本,这是最好的方法吗?或者有更简单的方法吗?

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>";
    }
}
?>

输出:

- 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

需要将带有XXX的标题排在最底层。

1 个答案:

答案 0 :(得分:1)

我建议你先建立一个如下信息详情列表:

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

然后,您可以使用usort轻松对该列表进行排序,因为现在可以轻松访问该评级:

usort($infolist, "infosort");

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

最后你可以写出来自infolist数组的排序结果:

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>";
}