在 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/