【问题标题】:Sorting an array in PHP and pushing it back to the file在 PHP 中对数组进行排序并将其推回文件
【发布时间】:2017-04-29 17:33:36
【问题描述】:

我有一个 CSV 文件,其中存储了第一列中的图像 ID,以及所述图像的 url 及其标签文本(电子表格在其他地方转换为图片库)。有多个名为 1.csv、2.csv、3.csv 等的 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 循环中进行转换,它本身存在于一个循环中,一个一个地遍历每个文件

$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:我知道排序后的表格需要刷新才能显示,这很好,因为它是供我个人使用的。

【问题讨论】:

    标签: php database sorting csv plugins


    【解决方案1】:

    据我了解,您希望在按下菜单之前按第一列对数据进行排序。

    您可以尝试使用函数“usor”和回调函数进行排序。你可以试试这个代码:

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

    【讨论】:

    • 感谢您的回复,此代码在循环中,因为有多个文件。您的代码确实对数据库进行了排序,但现在所有打印出来的数据库只是一遍又一遍地打印 1.csv - 尽管已排序。如何修改它以支持我的循环中的多种用途(我的所有代码都包含在其中)
    • 首先您必须将所有文件放在一个数组中,然后您只需在它们之间进行迭代。您可以尝试这样的事情:stackoverflow.com/questions/29608709/… 我将编辑答案以更好地解决您的问题...
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2019-05-15
    • 1970-01-01
    • 2020-09-30
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多