简体   繁体   中英

PHP CSV to associative array with top row as keys and columns as value arrays

I am trying to create a multidimensional array using CSV file so that for example:

"a","b","c"
1,2,3
4,5,6

would return as:

array(  
    'a' => array(1, 4),  
    'b' => array(2, 5),  
    'c' => array(3, 6),  
    )

But the code I have:

<?php
function readCSV($csvFile) {
    $aryData = [];
    $header = NULL;
    $handle = fopen($csvFile, "r");
    if($handle){
        while (!feof($handle)){
            $aryCsvData = fgetcsv($handle);
            if(!is_array($aryCsvData)){
                continue;
            }
            if(is_null($header)){
                $header = $aryCsvData;
            } 
            elseif(is_array($header) && count($header) == count($aryCsvData)){
                $aryData[] = array_combine($header, $aryCsvData);
            }
        }
        fclose($handle);
    }
    return $aryData;
}

print_r(readCSV("Book1.csv"));
?>

Returns it as:

Array(  
[0] => Array ( [a] => 1 [b] => 2 [c] => 3 )   
[1] => Array ( [a] => 4 [b] => 5 [c] => 6 )   
)

Would appreciate any help!

Instead of building the end array as you go along. This code reads the header row before the loop, then just reads all of the data lines into another array. It then combines each element of the header array with the matching column from the data array (using array_column() and the position of the header element)...

function readCSV($csvFile) {
    $aryData = [];
    $output = [];
    $header = NULL;
    $handle = fopen($csvFile, "r");
    if($handle){
        $header = fgetcsv($handle);
        while ($aryData[] = fgetcsv($handle));
        foreach ( $header as $key=>$label) {
            $output[$label] = array_column($aryData, $key);
        }
        fclose($handle);
    }
    return $output;
}

Read the first row of the file and create the associative array with empty columns. Then read each remaining row and loop through it, pushing the values onto the column arrays.

<?php
function readCSV($csvFile) {
    $aryData = [];
    $handle = fopen($csvFile, "r");
    if($handle){
        $headerRow = fgetcsv($handle);
        if (!$headerRow) {
            return $aryData;
        }
        foreach ($headerRow as $colname) {
            $aryData[$colname] = [];
        }
        while ($aryCsvData = fgetcsv($handle)){
            foreach ($headerRow as $colname) {
                $aryData[$colname][] = each($aryCsvData);
            }
        }
        fclose($handle);
    }
    return $aryData;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM