【问题标题】:Sort flat file array对平面文件数组进行排序
【发布时间】:2013-05-25 01:53:15
【问题描述】:

我正在尝试按公司名称的字母顺序从平面文件中对数据进行排序。我在想一个简单的排序就可以解决这个问题,但我错了。我现在认为我需要使用usortcmp,然后创建另一个临时数组。我怎样才能做到这一点?

这是我当前的代码。

$data_file = fopen($data_file_url, "r");
fgets($data_file); // IGNORE FIRST LINE IN FLATFILE - column names
while (!feof($data_file) ) {
    $data_lines = fgets($data_file);
    $data_ele = explode('|', $data_lines);

    $company_name = $data_ele[0];
    $section = $data_ele[1];
    $category = $data_ele[2];
    $service = $data_ele[3];
    $service = substr_replace($service,"",-1); // trim last char
}

【问题讨论】:

  • 请预览$data_file_url
  • 在写入文件之前对数据进行排序比每次读取时都重新排序要高效得多。

标签: php sorting flat-file


【解决方案1】:

我会通过使用公司名称作为数组中的键来改进 Beats 的回答。

如果每个公司有多个条目,则有一个子数组。

通过将键用作数组,它在插入时已被索引。

我相信它会更快。

你也可以在这里使用fgetcsv,这样可能也快一点。

【讨论】:

    【解决方案2】:

    您应该首先将所有元素存储在一个大数组中,然后使用回调对其进行排序:

    $data_file = fopen($data_file_url, "r");
    fgets($data_file); // IGNORE FIRST LINE IN FLATFILE - column names
    
    $companies = array();
    while (!feof($data_file) ) {
        $data_lines = fgets($data_file);
        $data_ele = explode('|', $data_lines);
    
        $row = array();
        $row['company_name'] = $data_ele[0];
        $row['section'] = $data_ele[1];
        $row['category'] = $data_ele[2];
        $row['service'] = $data_ele[3];
        $row['service'] = substr_replace($row['service'],"",-1); // trim last char
    
        $companies[] = $row;
    }
    
    usort($companies, function ($a, $b) {
        return strcmp($a['company_name'], $b['company_name']);
    });
    

    请注意:我使用的是 PHP 5.3.0 中引入的匿名函数。

    【讨论】:

    • 在我的原始代码中,我会像这样打印值:echo $company - - - 如何打印新值?
    • (*代码中有一个错字:substr_replace 中的“$$”。)但即使在修复此问题后,我在运行此代码时仍然收到错误...在 usort 函数中的某处.有什么想法吗?
    • 您运行的是哪个 PHP 版本?匿名函数至少需要 5.3.0。要进行调试,您应该在 usort 之前执行 print_r 并检查数组是否正常
    猜你喜欢
    • 1970-01-01
    • 2016-03-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多