迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

在 PHP 中将 CSV 文件转换为数组

作者:迹忆客 最近更新:2023/03/26 浏览次数:

逗号分隔值 (CSV) 文件是数据管道的重要组成部分。 无论使用何种编程语言,我们的应用程序都可以使用 CSV。

CSV 文件常用于以行和列格式存储数据。 因此,当我们在 PHP 应用程序中处理 CSV 文件时,数组是保存其值的完美数据结构。

在本文中,我们将详细介绍并向您展示可让我们在 PHP 中读取 CSV 并将其转换为数组的内置 PHP 函数。


在 PHP 中使用 fopen() 和 fgetcsv() 将 CSV 转换为数组

对于本节和其他两节,我们将使用包含 51 行和 4 列的保存状态住房值的 CSV 文件 (state_housing_values.csv) 来展示这些函数的工作原理。

首先,我们需要 fopen() 函数来打开 CSV 文件并将其指向 fgetcsv() 函数作为第一个参数,其余参数可选。 其他参数包括长度、分隔符、外壳和转义符。

现在,让我们将 CSV 文件转换为数组。

$file = fopen('state_housing_values.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
    var_dump($line);
}
fclose($file);

输出结果如下:

array(4) {
  [0]=>
  string(5) "State"
  [1]=>
  string(5) "Price"
  [2]=>
  string(13) "1-year change"
  [3]=>
  string(15) "1-year forecast"
}
array(4) {
  [0]=>
  string(7) "Alabama"
  [1]=>
  string(7) "143,072"
  [2]=>
  string(3) "5.5"
  [3]=>
  string(4) "-1.1"
}
array(4) {
  [0]=>
  string(6) "Alaska"
  [1]=>
  string(7) "300,073"
  [2]=>
  string(4) "-2.3"
  [3]=>
  string(4) "-4.8"
}
array(4) {
  [0]=>
  string(7) "Arizona"
  [1]=>
  string(7) "277,574"
  [2]=>
  string(3) "7.5"
  [3]=>
  string(4) "-0.5"
}
array(4) {
  [0]=>
  string(8) "Arkansas"
  [1]=>
  string(7) "130,907"
  [2]=>
  string(3) "3.8"
  [3]=>
  string(4) "-1.7"
}
array(4) {
  [0]=>
  string(10) "California"
  [1]=>
  string(7) "578,267"
  [2]=>
  string(3) "4.4"
  [3]=>
  string(4) "-1.1"
}
...

在我们继续之前,我们可以删除标头,这在我们的 PHP 代码库中可能不需要。 为此,我们可以在 while 循环之前添加 $line = fgetcsv($file)

$file = fopen('state_housing_values.csv', 'r');
$line = fgetcsv($file);
while (($line = fgetcsv($file)) !== FALSE) {
    var_dump($line);
}
fclose($file);

输出结果如下:

array(4) {
  [0]=>
  string(7) "Alabama"
  [1]=>
  string(7) "143,072"
  [2]=>
  string(3) "5.5"
  [3]=>
  string(4) "-1.1"
}
array(4) {
  [0]=>
  string(6) "Alaska"
  [1]=>
  string(7) "300,073"
  [2]=>
  string(4) "-2.3"
  [3]=>
  string(4) "-4.8"
}
...

有了这个,标题不再在数组中,

上面的数组格式很难使用。 为了使数组更可行,我们需要重构代码并使用 array_combine()。

<?php

$filename = 'state_housing_values.csv';
$delimiter = ',';

if (file_exists($filename) || is_readable($filename)) {
    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
            if (!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    var_dump($data);
} else {
    error_log("Error reading file.");
}
?>

输出结果如下:

array(50) {
  [0]=>
  array(4) {
    ["State"]=>
    string(7) "Alabama"
    ["Price"]=>
    string(7) "143,072"
    ["1-year change"]=>
    string(3) "5.5"
    ["1-year forecast"]=>
    string(4) "-1.1"
  }
  [1]=>
  array(4) {
    ["State"]=>
    string(6) "Alaska"
    ["Price"]=>
    string(7) "300,073"
    ["1-year change"]=>
    string(4) "-2.3"
    ["1-year forecast"]=>
    string(4) "-4.8"
  }
...

在某些情况下,分隔符不是逗号 , 。 因此,我们需要指定分隔符。

其他分隔符可以是分号 ;、空格 " " 或制表符 \t。 要在函数内指定分隔符,可以遵循以下代码。

$delimiter = ';'; // semi-colon
fgetcsv($handle, 1000, $delimiter)
Use the str_getcsv() to Convert CSV to Array in PHP
Here, we will make use of the file() function to process the CSV, loop through the file pointer using the foreach loop and place each value within the array $data via the str_getcsv() function.

$data = array();
$lines = file('state_housing_values.csv', FILE_IGNORE_NEW_LINES);

foreach ($lines as $key => $value) {
    $data[$key] = str_getcsv($value);
}

print_r($data);

输出结果如下:

Array
(
    [0] => Array
        (
            [0] => State
            [1] => Price
            [2] => 1-year change
            [3] => 1-year forecast
        )

    [1] => Array
        (
            [0] => Alabama
            [1] => 143,072
            [2] => 5.5
            [3] => -1.1
        )

    [2] => Array
        (
            [0] => Alaska
            [1] => 300,073
            [2] => -2.3
            [3] => -4.8
        )

    [3] => Array
        (
            [0] => Arizona
            [1] => 277,574
            [2] => 7.5
            [3] => -0.5
        )

    [4] => Array
        (
            [0] => Arkansas
            [1] => 130,907
            [2] => 3.8
            [3] => -1.7
        )

    [5] => Array
        (
            [0] => California
            [1] => 578,267
            [2] => 4.4
            [3] => -1.1
        )

    [6] => Array
        (
            [0] => Colorado
            [1] => 408,794
            [2] => 3.1
            [3] => -1.7
        )

    [7] => Array
        (
            [0] => Connecticut
            [1] => 259,855
            [2] => 1.4
            [3] => -2.3
        )

    [8] => Array
        (
            [0] => Delaware
            [1] => 257,521
            [2] => 0
            [3] => -2.9
        )

    [9] => Array
        (
            [0] => Florida
            [1] => 252,309
            [2] => 3.6
            [3] => -1.5
        )

    [10] => Array
        (
            [0] => Georgia
            [1] => 206,804
            [2] => 4.9
            [3] => -1.5
        )
...

对上面的代码添加一些更改以删除标头。 我们将使用 if 条件语句删除包含标题的第一个数组。

foreach ($lines as $key => $value) {
    if (!$key == 0) {
        $data[$key] = str_getcsv($value);
    }
}

print_r($data);

输出结果如下:

Array
(
    [1] => Array
        (
            [0] => Alabama
            [1] => 143,072
            [2] => 5.5
            [3] => -1.1
        )
...

在 PHP 中使用 array_map() 将 CSV 转换为数组

上面的代码片段使用循环或预处理将 CSV 转换为数组。 但是,有一种更好、更快且易于阅读的方法,可以使用 array_map()file() 函数将 CSV 文件转换为 PHP 中的数组。

$csv = array_map('str_getcsv', file('state_housing_values.csv'));
print_r($csv);

输出结果如下:

Array
(
    [0] => Array
        (
            [0] => State
            [1] => Price
            [2] => 1-year change
            [3] => 1-year forecast
        )

...

    [50] => Array
            (
                [0] => Wyoming
                [1] => 256,089
                [2] => 5.7
                [3] => -1.6
            )

)

这些函数可以处理具有大量值的 CSV 文件,为了展示这一点,我们将在 CSV 文件上使用 array_map() 函数来保存 1857 行和 17 列的杠杆数据,并且删除数组的标题。

$csv = array_map('str_getcsv', file('leverage.csv'));
unset($csv[0]);
print_r($csv);

代码的输出(在 0.257 秒时退出)如下所示。

Array
(
    [1] => Array
        (
            [0] => 001300
            [1] => 20150331
            [2] => 2015
            [3] => 1
            [4] => INDL
            [5] => C
            [6] => D
            [7] => STD
            [8] => USD
            [9] => 2015Q1
            [10] => 2015Q1
            [11] => 45357.0000
            [12] => 781.7070
            [13] => 5661.0000
            [14] => 15432.0000
            [15] => A
            [16] => 104.3100
        )

...
    [1856] => Array
        (
            [0] => 252940
            [1] => 20171231
            [2] => 2017
            [3] => 3
            [4] => INDL
            [5] => C
            [6] => D
            [7] => STD
            [8] => USD
            [9] => 2017Q4
            [10] => 2017Q3
            [11] =>
            [12] =>
            [13] =>
            [14] =>
            [15] => A
            [16] => 7.2700
        )

)

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 PHP 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:183 分类:PHP

本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

PHP 中的重定向

发布时间:2023/03/29 浏览次数:136 分类:PHP

本教程演示了如何将用户从页面重定向到 PHP 中的其他页面

PHP 分页

发布时间:2023/03/29 浏览次数:66 分类:PHP

本教程介绍如何在 PHP 中对数据库行进行分页

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便