2013-07-15 40 views
1

我有一個文本文件,我想通過PHP排序,我有點難倒sort()或asort()會排序行中的第一個字母而不是特定的部分排序分隔文本文件Php

我會讀所有文本使用

$list = array(file($filename, FILE_IGNORE_NEW_LINES)); 

,但你將如何實現一個排序()的陣列線?

所以我的文本文件包含

Name1→Text1→1→1→1062166→3499999999 
    Name2→Text2→1→1→1332130→1999999999 
    Name3→Text3→1→1→1040121→8249999999 
    Name4→Text4→1→1→1060075→7249999999 
    Name5→Text5→1→1→1402172→249999999 
    Name6→Text6→1→1→1222044→199999999 
    Name7→Text7→1→1→1542015→299999999 

我想輸出由過去的數分隔所以輸出應該是

Name6→Text6→1→1→1222044→199999999 
    Name5→Text5→1→1→1402172→249999999 
    Name7→Text7→1→1→1542015→299999999 
    Name2→Text2→1→1→1332130→1999999999 
    Name1→Text1→1→1→1062166→3499999999 
    Name4→Text4→1→1→1060075→7249999999 
    Name3→Text3→1→1→1040121→8249999999 
+0

有'usort()'。你可以在那裏有你自己的比較函數。 – Sven

+0

'fgetcsv',創建數組,'usort'數組,'fputcsv'到_new_文件(無法對現有文件進行排序...),成功時(確保!),取消舊文件鏈接,將新文件移到舊文件的位置。 – Wrikken

回答

1

可以循環,並與您的主要創建數組並對該數組進行排序並將其返回。在下面的代碼示例中,我使用作爲文字值,但如果您的意思是選項卡字符替換\t。你也可以使用explode

$list = file($filename, FILE_IGNORE_NEW_LINES); 

$new = array(); 
foreach ($list as $item) { 
    preg_match("/^(.*)(→[^→]+)$/", $item, $matches); 
    $new[$matches[1]] = $item; 
} 

ksort($new); 

$list = array_values($new); 
+0

我認爲OP意味着\ t ...→只是選擇表示的符號......但我可能是錯的。 – Orangepill

+0

@Orangepill哦,okie – DevZer0

0

嘗試是這樣的(我被假設你的意思{標籤})

$fp = fopen ($filename, "r"); 
$contents = array(); 
while($contents[] = fgetcsv($fp, 0, "\t"){} 
fclose($fp); 
usort($contents, function($a, $b) {return strnatcmp($a[5],$b[5]); }); 

注意:此語法需要PHP 5.3+

注意

更改爲返回strnatcmp以防止數字溢出。