如何对包含csv文件数据的表进行排序

时间:2012-05-02 01:27:44

标签: php usort

我必须根据用户选择的方式对表中的文件数据进行排序(只有选项是升序和降序)<​​/ p>

这是我的代码:

if($submit=="Display"){
    if ($headings=="0"){echo "<h2>Error</h2>";}
    elseif ($search==""){echo "<h2>Error</h2>";}
    else {

        if($headings==$headings_array[0])
            echo "<table border='1'>";
            $f = fopen("data.csv", "r");

            while ($line = fgetcsv($f)){
            echo "<tr>";
                foreach ($line as $cell) {
                    echo "<td><center>".$cell."</center></td>";
                }
            echo "<tr>";
            }   
            fclose($f);

            function my_sort($a, $b){
                if ($a == $b) return 0;
                return ($a > $b) ? -1 : 1;
                }

            $arr = $cell;

            usort($arr, "my_sort");

            print_r ($arr);
            echo "</table>";
    }
}

但它没有排序。有人能发现它有什么问题吗?如果你有一个更有效的方法,请告诉我,因为我有headings,对每个标题if statements都会很痛苦。

要明确,以下是我必须做的事情:

对于用户选择的每个排序字段(标题),我必须根据标题排列显示

if($headings==$headings_array[0])

$headings_array[0]等于Names因此,表格应按字母(或反向字母)顺序显示Names

的值

额外信息:

$headings是选择框的名称
$headings_array是选择框的数组值
$search是单选按钮,包含表格是按升序还是按降序分类 仅限PHP

感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

我认为你的排序功能是错误的。它正在做与sort()或rsort()相同的事情。

usort只是比较两个数组元素,并根据返回的值确定是否需要交换它们。你发送$ a和$ b,这应该是csv行。然后比较所需的索引并相应地交换行。

您需要按标题给出的数组索引进行排序。也许尝试这样的事情:

global $headings;

...
$arrayToBeSorted = array();

// send in an array of lines
while ($line = fgetcsv($f)){
    $arrayToBeSorted[] = $line;
}

usort($arrayToBeSorted, 'my_sort');

function my_sort($lineA, $lineB){
    // set this to the column that needs to be sorted
    global $headings;

    $linePartsA = explode(',' $lineA);
    $linePartsB = explode(',' $lineB);
    if ($linePartsA[$headings] == $linePartsB[$heading) return 0;
        return ($linePartsA[$headings] > $linePartsB[$heading]) ? -1 : 1;
    }
}

答案 1 :(得分:0)

为什么你只想使用php。我使用了非常有效的jquery表分类器。链接table sorter