2016-12-14 40 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