php - csv文件的多维数组排序过程

标签 php arrays algorithm sorting multidimensional-array

在 PHP 中有一个数组。是这样设置的

$array_var = array(array(1,2,3,4), array(5,6,7,8), array(3,5,3,9));

此数组来自使用 fgetcsv 函数获得的 csv 文件。如果我要正确地回显数组以显示其内容,我会这样显示:

field1  field2  field3  field4
  1       2       3       4
  5       6       7       8
  3       5       3       9

等等等等

现在我想对这个数组进行排序。但我只想对所有数组中的一列进行排序。换句话说,例如,我想获取主数组中每个数组中的每三个值,并按字母顺序升序列出它们。因此,对于特定情况,我们将从上表中获取 field3 中的每个值,并对其进行排序。并使排序的最终结果将重新排列列,以便它们与它们的值正确对齐。

最终结果

field1  field2  field3  field4
  1       2       3       4
  3       5       3       9
  5       6       7       8

等等等等

如何实现?

挑战的原因是我试图从 csv 文件的单个列中删除重复项。我认为最快的方法是对值进行排序并查找范围内的匹配项。

最佳答案

很难给你一个准确的答案,因为你的解释中有些事情被遗漏了。例如,按其中一列排序但在其他列中有差异的行应该如何在内部排序?它们应该按其他列排序,保留原始顺序还是可以按任意顺序放置?

鉴于我解释您的问题的方式,我可能会定义自己的类进行比较。

<?php
class ColumnCompare {
  function __construct($column) {
    $this->column = $column;
  }

  function compare($a, $b) {
    if ($a[$this->column] == $b[$this->column]) {
      return 0;
    }
    return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
  }
}

// Hard-coded input
$array_var = array(array(1,2,3,4), array(5,6,7,8), array(3,5,3,9));
$sort_by_col = 2;

// Create object for sorting by a particular column
$obj = new ColumnCompare($sort_by_col);
usort($array_var, array($obj, 'compare'));

// Write CSV to standard output
$sout = fopen('php://stdout', 'w');
foreach ($array_var as $fields) {
  fputcsv($sout, $fields);
}
fclose($sout);
?>

最后你提出了另一个问题,这是无法回答的。如果您从单个列中删除重复项,那么该行的其余部分应该发生什么?应该只保留一行,在那种情况下是哪一行?您也可以通过“删除重复项”来表示您想要删除值并将 NULL 放在它们的位置。如果您希望解决该特定问题,则需要提供一些详细信息。

如果您的 CSV 文件非常简单,并且任何重复行上的所有值都是相同的(在您的示例中编辑之前就是这种情况),您可以轻松地运行命令,例如

sort myfile.csv | uniq

但我觉得它比这更复杂。例如,uniq 还具有仅返回重复行的设置。也可以编写命令以从每一行中检索特定列并对其进行操作。但正如我所说,没有更多信息就不可能构建这样的命令。

关于php - csv文件的多维数组排序过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11649840/

相关文章:

c - 遍历不同的数组C

ios - 如何在结构内部调用结构?

php - 将键和值添加到现有数组

c++ - 如何在没有分隔符的大文本文件中查找所有字典单词?

php - MySQL 查询返回的分组结果

php - 存储查询结果的记录ID以便进一步浏览?

php - MySQL 中存储的 JSON 编码 POST 的问题

php - 验证我的 PHP 表单并提交到数据库

sql - Postgres 将数组的每个元素(如果不存在)附加或设置到数组列

algorithm - 需要算法将不同大小的文件分组为大致相等的 block