PHPでCSVファイルを配列に変換する

Olorunfemi Akinlua 2023年6月20日
  1. fopen()fgetcsv() を使用して、PHP で CSV を配列に変換する
  2. str_getcsv() を使用して、PHP で CSV を配列に変換する
  3. array_map() を使用して、PHP で CSV を配列に変換する
PHPでCSVファイルを配列に変換する

カンマ区切り値 (CSV) ファイルは、データ パイプラインの大きな部分を占めています。 プログラミング言語に関係なく、アプリケーションには CSV の場所があります。

CSV ファイルは、行と列の形式でデータを保存するのに一般的です。 したがって、配列は、PHP アプリケーション内で CSV ファイルを処理するときに値を保持するのに最適なデータ構造です。

この記事では、PHP で CSV を読み取って配列に変換できる組み込みの PHP 関数について詳しく説明し、紹介します。

fopen()fgetcsv() を使用して、PHP で CSV を配列に変換する

このセクションと他の 2つのセクションでは、51 行 4 列の州の住宅の値 (state_housing_values.csv) を保持する CSV ファイルを使用して、これらの機能がどのように機能するかを示します。

まず、CSV ファイルを開き、最初の引数として fgetcsv() 関数をポイントする fopen() 関数が必要です。残りの引数はオプションです。 その他のパラメータには、lengthseparatorenclosure、および escape が含まれます。

それでは、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)

str_getcsv() を使用して、PHP で CSV を配列に変換する

ここでは、file() 関数を使用して CSV を処理し、foreach ループを使用してファイル ポインターをループし、str_getcsv() を介して配列 $data 内に各値を配置します。 関数。

$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
        )
...

array_map() を使用して、PHP で CSV を配列に変換する

上記のコード スニペットでは、ループまたは前処理を使用して CSV を配列に変換しています。 ただし、PHP 内で array_map() および file() 関数を使用して CSV ファイルを配列に変換する、より優れた、より高速で読みやすい方法があります。

$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 ファイルを処理できます。それを示すために、1857 行 17 列のレバレッジ データを保持する CSV ファイルで array_map() 関数を使用し、ヘッダーを削除します。 アレイの。

$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
        )

)

CSV ファイルは、コードで再生するために以下で利用できます。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - PHP CSV

関連記事 - PHP Array