在 PHP 中将 CSV 文件转换为数组
逗号分隔值 (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
)
)
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341