在PHP中对数组进行排序并将其推回到文件

时间:2016-12-14 11:42:03

标签: php database sorting csv plugins

我有一个CSV文件,用于存储第一列中图像的ID,以及所述图像的网址及其标签文本(电子表格转换为其他地方的图片库)。有多个CSV名为1.csv,2.csv,3.csv等等 - 为了循环目的,我可以简单地抓住我的循环计数器连接到“.csv”来获取文件 - 因为总会有一个设置顺序CSV的但不总是一定数量。

当用户使用我的控制面板编辑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循环中转换,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 个答案:

答案 0 :(得分:1)

据我所知,您希望在按下菜单之前按第一列订购数据。

您可以尝试使用功能&#39; usort&#39;进行订购,并使用回调功能。您可以尝试以下代码:

//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>";