如何使用PHP正确操作和利用csv数据?

时间:2011-03-07 03:42:45

标签: php

我需要一些帮助,了解如何利用fgetcsv和数组来操作数据。我很困惑如何关联多端口的数据来实现“ORDER BY $ lastNameArray”功能而不混淆数据。我将其中一个数组元素排序很好,但另一个“数组2”仍然是相同的,让它混淆了。如何正确排序数据,并保持与行上其他列的数据关系,以便我可以遍历它并操作,回显,打印等。

错误讯息:

  

警告:array_multisort()   [function.array-multisort]:参数   预计2将是一个数组或排序标志   C:\ wamp \ www \ Codelobster2.php就行了   42

正确用于循环显示csv并在表格中显示电话号码的代码。这不排序。除了排序,它完全符合我的需要。

 <?php 

//table setup
    //print_r($associativeAddressArray);
    //header setup for table output view
    echo "<h1>Phone Directory</h1>";
    echo "<table border = '1' width = '50%'>\n";
    echo "<tr>";
    echo "<th>Name</th>";
    echo "<th>Phone Number</th>";


    //get data from file
    $fileName = 'phoneData.csv';
    $file = fopen($fileName,"r");


    //while not to end of file
    while (!feof($file) ) 
    {

        while (($csv_line = fgetcsv($file)) !== FALSE)
        {
            //print_r($csv_line);
                echo "<tr>";    //beginning new row of record
                echo "<td>" . $csv_line[0] .", ".  $csv_line[1]. "</td>";  // 0=lastName, 1=FirstName
                echo "<td>" . $csv_line[5] ."-" .  $csv_line[6]. "</td>";   //
                echo "</tr>"; //new row
        }
        echo "</table>\n";
    }
    echo '<FORM><INPUT TYPE="button" VALUE="Back" onClick="history.go(-1);return true;"></FORM>';   //let me know if a better way to do this exists, I'm very limited on html experince

?>

作为对其他学生的进一步编辑,引用数组的最后一个循环在我做的时候起作用:

//array_multisort($names, $data); // need to sort the data by last name while keeping the seperate arrays in sync
    array_multisort($names, SORT_DESC, $phones, SORT_DESC, $data);

    //Obtain a list of columns
    foreach ($data as $record) 
        {
                echo "<tr>";    //beginning new row of record
                echo "<td>" . $record['name'] . "</td>";  // 0=lastName, 1=FirstName
                echo "<td>" . $record['phone'] . "</td>";   //
                echo "</tr>"; //new row

        } 

2 个答案:

答案 0 :(得分:3)

如果你想使用php的数组排序功能对它进行排序,那么你需要建立一个完整的数组,当你从文件中读取时,你将无法做到这一点。

因此,在读取每一行时,不需要循环并打印出来,而是需要构建一个包含所有数据的数组。

假设他们只需按姓名或电话号码排序:

$data = array();
while (($csv_line = fgetcsv($file)) !== FALSE) {
    $name = $csv_line[0] .", ".  $csv_line[1];
    $phone = $csv_line[5] ."-" .  $csv_line[6];
    $data[] = array(
        'name' => $name,
        'phone' => $phone
    );
    $phones[] = $phone;
    $names[] = $name;
}

你也不需要在feof while循环中包含while循环,fgetcsv将在出错时返回false(包括EOF)。

获得$ data数组后,可以使用array_multisort(如示例3所示):

array_multisort($names, SORT_DESC, $phones, SORT_DESC, $data);

大文件可能会失败,因为所有数据都需要存储在内存中,利用数据库存储数据并返回排序数据是一种更有效的选择。

答案 1 :(得分:1)

另外,根据您导入的数据量,您可能会更好地将CSV数据导入关系数据库。然后通过DB运行排序或其他功能。

同样,它真的取决于流量,你可以使用array_multisort()来充分排序。