【问题标题】:Sorting CSV data via PHP array通过 PHP 数组对 CSV 数据进行排序
【发布时间】:2020-07-03 03:24:27
【问题描述】:

我正在尝试从 .CSV 获取数据,将其排序为数组(使用 PHP),在其中选择特定值,从该选择中创建一个新数组并将其编码为可用于 ajax 的 json 对象。

有了这段代码,我几乎可以得到我想要的。

$CSV_url = '../fichier-csv/commande.csv';                 // CSV file 
$csv["data"] = array_map('str_getcsv', file($CSV_url));   // to PHP array
array_shift($csv["data"]);                                // remove first line (headers)
$jsonData = json_encode($csv);                            // to Json

CSV 文件每行包含大约 16 个类别的数据,但我在最终的 json 中只需要其中的 4 个。

我坚持这个结果。如果我在 json_encode ($csv) 之前打印,我会得到一个不错的数组,但是我很难选择想要的数据并用它制作新数组(我认为应该这样做,但我是初学者,也许有更简单的方法来做到这一点)。 输出的 Json 也应该按照每个数组的 [0] 值的升序排序。这是我得到的数组的开始(其中 378 个要处理):

Array (
    [data] => Array
        (
            [0] => Array
                (
                    [0] => 100120148
                    [1] => 1.0000
                    [2] => 7.4200
                    [3] => 2.4700
                    [4] => 4.9100
                    [5] => 0.0000
                    [6] => 14.8000
                    [7] => 0.3000
                    [8] => marie
                    [9] => jardin
                    [10] => 40 rue mazé
                    [11] => 87400
                    [12] => 066825197
                    [13] => magicayllo64@hotmail.fr
                    [14] => 1
                    [15] => magicayllo64@hotmail.fr
                )

            [1] => Array
                (
                    [0] => 100120162
                    [1] => 1.0000
                    [2] => 45.7500
                    [3] => 10.8000
                    [4] => 8.2500
                    [5] => 0.0000
                    [6] => 64.8000
                    [7] => 2.0000
                    [8] => __
                    [9] => Lucien fizon
                    [10] => 56 impasse pazarre
                    [11] => 25000
                    [12] => 0649851473
                    [13] => 144f21ds8u4u6f5f@shopify.com
                    [14] => 4
                    [15] => 144f21ds8u4u6f5f@shopify.com
                )

如何获取每个子数组的值 0、8、9 和 12 并用它创建一个新数组,这样我就可以将此所需的数组编码为 Json ?

谢谢。

【问题讨论】:

    标签: php arrays json csv


    【解决方案1】:

    在阅读文件时处理它可能会更好,使用fopen()fgetcsv() 您可以只提取您想要的项目而不是全部存储。

    $CSV_url = '../fichier-csv/commande.csv';
    $fh = fopen($CSV_url, "r");
    $csv = [ "data" => [] ];
    fgets($fh);             // Ignore header
    while ( $row = fgetcsv($fh) )   {
        $csv["data"][] = [$row[0], $row[8], $row[9], $row[12]];
    }
    fclose($fh);
    $jsonData = json_encode($csv);
    

    【讨论】:

    • 非常感谢@Nigel Ren!我花了这么多时间在解决方案上...如果问的不是太多,请问您对如何按[0]行的值对获得的PHP数组进行排序有一个想法;按升序(从低值到高值)?
    • 你也许可以使用sort( $csv['data'] );逃脱
    • 我认为这种排序需要更多参数,“排序”完成了这项工作。我正在研究array_multisort,因为我认为有必要指定用于对数组进行排序的行。再一次,非常感谢@Nigel ren!
    【解决方案2】:

    您可以再次使用array_map 在每行中仅选择所需的列:

    $csv["data"] = array_map(fn($row) => [$row[0], $row[8], $row[9], $row[12]], $csv["data"]);
    

    如果您还没有使用 PHP 7.4,则需要使用传统语法而不是箭头函数:

    $csv["data"] = array_map(function(row) {
        return [$row[0], $row[8], $row[9], $row[12]];
    }, $csv["data"];
    

    【讨论】:

    • 很高兴有另一种测试方法,谢谢! Il 进行了一些编辑(在 PHP 7.3.12 中)效果很好:> $csv["data"] = array_map(function($row) { > return [$row[0], $row[8], $row[9], $row[12]]; > }, $csv["data"]); > sort ($csv["data"]); > $jsonData = json_encode($csv);
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多