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文件中的单个列中删除重复项。我认为最快的方法是对值进行排序,并在范围内寻找匹配。
发布于 2012-07-25 14:26:14
很难给出确切的答案,因为在你的解释中有一些东西你遗漏了。例如,按照其中一个列排序但在其他列中有差异的行应该如何在内部排序?它们是按其他列排序,还是按原来的顺序排列,还是按任意顺序排列?
考虑到我解释你的问题的方式,我可能会定义我自己的类进行比较。
<?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);
?>最后,你提出了另一个问题,这是不可能回答的。如果从单个列中删除重复项,那么行的其余部分将发生什么情况?应该只保留一行,在这种情况下,哪一行?您也可以通过“删除重复项”来表示要移除值并将其置入空值中。如果你想要解决这个问题,你需要提供一些细节。
如果CSV文件非常简单,而且任何带有重复项的行上的所有值都是相同的(在编辑之前的示例中就是如此),则可以轻松地运行以下命令
sort myfile.csv | uniq但我有种感觉比这更复杂。例如,uniq还具有只返回重复行的设置。还可以编写命令从每一行检索某一列并对其进行操作。但正如我所说,如果没有更多的信息,就不可能构建这样的命令。
https://stackoverflow.com/questions/11649840
复制相似问题