2013-05-29 44 views
1

我試圖從平面文件按公司名稱的字母順序排序數據。我在想,一個簡單的排序可以解決這個問題,但我錯了。我現在認爲我需要使用usortcmp,然後創建另一個臨時數組。我怎樣才能做到這一點?排序平面文件數組

這是我現在的代碼。

$data_file = fopen($data_file_url, "r"); 
fgets($data_file); // IGNORE FIRST LINE IN FLATFILE - column names 
while (!feof($data_file)) { 
    $data_lines = fgets($data_file); 
    $data_ele = explode('|', $data_lines); 

    $company_name = $data_ele[0]; 
    $section = $data_ele[1]; 
    $category = $data_ele[2]; 
    $service = $data_ele[3]; 
    $service = substr_replace($service,"",-1); // trim last char 
} 
+0

請顯示'$ data_file_url'的預覽。 –

+0

在寫入文件之前對數據進行排序比在每次讀取時重新排序它要高效得多。 – Sammitch

回答

1

您應該先儲存在一個大陣列中的所有元素,之後它排序使用回調:

$data_file = fopen($data_file_url, "r"); 
fgets($data_file); // IGNORE FIRST LINE IN FLATFILE - column names 

$companies = array(); 
while (!feof($data_file)) { 
    $data_lines = fgets($data_file); 
    $data_ele = explode('|', $data_lines); 

    $row = array(); 
    $row['company_name'] = $data_ele[0]; 
    $row['section'] = $data_ele[1]; 
    $row['category'] = $data_ele[2]; 
    $row['service'] = $data_ele[3]; 
    $row['service'] = substr_replace($row['service'],"",-1); // trim last char 

    $companies[] = $row; 
} 

usort($companies, function ($a, $b) { 
    return strcmp($a['company_name'], $b['company_name']); 
}); 

請注意:我使用的是匿名函數在PHP 5.3.0引入的。

+0

在我的原始代碼中,我會打印這樣的值:echo $ company - - - 如何打印新值? – mar2195

+0

通過回顯數組中的值... – Beat

+0

(*代碼中有一個錯字:substr_replace中的「$$」)。但即使修復此錯誤,運行此代碼後仍然收到錯誤...在usort功能的某處。有任何想法嗎? – mar2195

0

只要將公司名稱用作數組中的關鍵字,我就會對Beats做出重要回答。

如果您有多個條目,每個公司都有一個子數組。

通過使用該鍵作爲數組,它在插入時已經被索引。

我相信它更快。

您也可以在這裏使用fgetcsv,這也可能會更快一點。