【问题标题】:php sort not working as expected?php 排序没有按预期工作?
【发布时间】:2012-12-31 00:52:15
【问题描述】:

我需要了解两个 CSV 文件之间的差异,在这种情况下,最新的文件 file2.csv 会用更新的版本覆盖具有相同值的行,并删除具有相同数据的行。

file1.csv

GHI, 0, 0
ABC, 12, 1
DEF, 10, 1

file2.csv

ABC, 8, 1
DEF, 10, 1
GHI, 2, 0

最终的 CSV 应该是这样的:

ABC, 8, 1
GHI, 2, 0

php 代码:

<?php
    $file1 = file('file1.csv');
    $file2 = file('file2.csv');

    sort($file1);
    sort($file2);

    var_dump($file1);
    var_dump($file2);

    $diff =  array_diff($file2, $file1);

    var_dump($diff);

    ?>

返回这个

ABC, 8, 1
DEF, 10, 1
GHI, 2, 0

现在当我手动将 file1.csv 更改为:

ABC, 12, 1
DEF, 10, 1
GHI, 0, 0

它按预期返回:

ABC, 8, 1
GHI, 2, 0

当我转储排序后的数组时,排序函数似乎可以正常工作,就像我手动更改顺序时一样

ABC, 12, 1
DEF, 10, 1
GHI, 0, 0

但它似乎不会产生相同的最终结果。有什么线索吗?

【问题讨论】:

    标签: php sorting csv


    【解决方案1】:

    file 将文件分成几行,但每一行仍有其结束的换行符。然而,最后一行没有。因此,它不等于文件中间的同一行内容。

    要解决此问题,您可以在最后一个元素中添加换行符:

    $file1[count($file1)-1] .= PHP_EOL;
    $file2[count($file2)-1] .= PHP_EOL;
    

    或者你可以从所有的行中去掉它们:

    array_walk($file1,function(&$a) {$a = trim($a);});
    array_walk($file2,function(&$a) {$a = trim($a);});
    

    【讨论】:

    • 那个也是。我不知道那个标志 XD
    • 谢谢我刚刚遍历了这些值并注意到缺少的换行符,当然转储没有显示出来。谢谢
    • @Kolink 将 FILE_IGNORE_NEW_LINES 添加到您的答案中,如 deceze 所述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2012-01-16
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多