2013-06-03 40 views
0

我有一个工作的PHP脚本,通过一个巨大的文件,并拉出特定的电影标题和评级。但现在我的任务是对它们进行“排序”,所以带有'xxx'的电影名称列在最下面。我已经研究过使用,但是用我已经写过的脚本,这是否是最好的方法?还是有更简单的方法?在我的php脚本的这种情况下,最好使用usort吗?

php脚本:

<?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排序的底部。

+0

尝试使用asort。 –

回答

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

它在通过函数之前给了我吨':'之后正确回声。有没有办法不显示':'的任何数据没有得到解析。换句话说,我用冒号分隔45行,然后以有序的方式得到我真正想要的数据。 – ValleyDigital

+0

我可能应该在'getInfo'调用后包含一个false检查。将更新答案以显示我的意思。 –

+0

噢,我刚刚在infolist [] ... if($ info!== false)之前加了一句:{ 非常感谢你!James Holderness – ValleyDigital

相关问题