2016-12-14 22 views
0

我有一個CSV文件,它在第一列中存儲圖像的ID以及所述圖像及其標籤文本的URL(電子表格被轉換爲圖片庫在其他地方)。有多個CSV名爲1.csv,2.csv,3.csv等 - 爲了循環的目的,我可以簡單地抓住我的循環計數器連接到「.csv」來抓取文件 - 因爲總會有一個設置的順序的CSV,但並不總是一定數量。在PHP中對數組進行排序並將其推回到文件中

當用戶使用我的控制面板編輯CSV時,它們可以更改圖像的ID,當它們添加新圖像時,它們也可以指定其ID。

這是的CSV

1,images/url/photograph.jpg,label text 
2,images/url/image2.jpg,label text 
4,images/url/apple.jpg,label text 
3,images/url/foo.jpg,label text 
5,images/url/5.jpg,label text 

一個示例中的每個CSV被轉換在下面的while循環,其本身存在一個循環,通過每個文件逐個

$htmlMenu .= "<tr> <th> Name/ID </th> <th> URL </th> <th> Text </th> </tr>"; 
    $file_handle = fopen($fullCSVUrl, "r"); 
    while (!feof($file_handle)) { 
     $line_of_text = fgetcsv($file_handle, 1024); 
     $htmlMenu .= "<tr> <td> $line_of_text[0] </td> <td> <a href=\"$line_of_text[1]\"> $line_of_text[1] </a> </td> <td> $line_of_text[2] </td>"; 
    } 
    $htmlMenu .= "</table>"; 

最後進入內,$ htmlMenu會得到迴應,它會將每個CSV作爲單獨的HTML表逐個生成一個頁面。我相信這意味着$ line_of_text [0]是從文件中獲取的ID。

如果可能,我希望在這個循環中按第一列對數據進行排序,然後將其發送回CSV,並在每次訪問此頁時按ID對文件進行有效排序。我不介意對CSV本身進行排序或對數組進行排序並將其推回到文件中,替換舊數據。

我希望我已經有效地解釋過,我知道我想要做什麼以及在哪裏,我只是無法弄清楚。感謝您的幫助。 PS:據我所知,排序後的表格需要刷新才能顯示,這是我個人使用的很好的方式。

回答

1

從我所瞭解的情況來看,您希望在推入菜單之前按第一列排序數據。

您可以嘗試使用具有回調函數的函數'usort'進行排序。您可以嘗試下面的代碼:

//This function compare the array rows 
function cmp_rows($a, $b){ 
    if ($a[0] == $b[0]) { 
     return 0; 
    } 
    return ($a[0] < $b[0]) ? -1 : 1; 
} 

$htmlMenu .= "<tr> <th> Name/ID </th> <th> URL </th> <th> Text </th> </tr>"; 

//get all the .csv files in paht $filePath 
$filePath = "/path/to/the/files"; 
$files = glob($filePath."/*.csv"); 

$date = array(); 
// Iterate each file 
if(count($files)) foreach($files as $file){ 
    if(($file_handle = fopen($fullCSVUrl, "r")!==FALSE){ 
     while (!feof($file_handle)) { 
      $data[] = fgetcsv($file_handle, 1024); 
     } 
     fclose($file_handle); 
    }else{ 
     echo "<li> Could not open file ".$file; 
    } 
} 

//Order the array using the compare function 'cmp_rows', previously defined 
usort($data,"cmp_rows"); 

if(count($data)) foreach($data as $line_of_text){ 
    $htmlMenu .= "<tr> <td> $line_of_text[0] </td> <td> <a href=\"$line_of_text[1]\"> $line_of_text[1] </a> </td> <td> $line_of_text[2] </td>"; 
} 
$htmlMenu .= "</table>"; 
+0

感謝您的回覆,此代碼在一個循環內,因爲有多個文件。你的代碼確實對數據庫進行了排序,但現在所有打印出的數據庫都只是1.csv一遍又一遍地打印 - 雖然排序。如何修改以支持我的循環中的多個用途(包含我的所有代碼) – Jordan

+0

首先,您必須將所有文件放在數組中,然後您只需在它們之間進行迭代。你可以嘗試這樣的事情:http://stackoverflow.com/questions/29608709/reading-csv-files-from-directory-and-showing-the-content-of-each-file-fails 我將編輯答案爲你的問題制定一個更好的方法... – megavexus