PHP CSV到具有行标题的关联数组

时间:2017-05-13 15:26:20

标签: php arrays csv multidimensional-array associative-array

我有一个CSV文件,其中包含我需要作为关联数组的列和行中的标题,我在SO上尝试过的示例对我没用。

我发现的最接近的例子是CSV to Associative Array,但我无法打印数据,所以我必须遗漏一些东西。

任何帮助将不胜感激

$all_rows = array();

$header = 1;//null; // has header
if (($handle = fopen($csv_file, "r")) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
        if ($header === null) {
            $header = $row;
            continue;
        }
        $all_rows[] = array_combine($header, $row);
    }

    fclose($handle);
}


// CSV Example
// [FOOD][IN_Stock][On_Order]
// [Apples][1302][2304]
// [Oranges][4356][335]


foreach ($all_rows as $key => $value) {

    // This prints ok based on the row number
    echo $all_rows[$key]['Instock'];

    // But i need to be able to call data based on the Food Type
    echo $all_rows['Apples']['In_Stock'];
    echo $all_rows['Apples']['On_order'];
    echo $all_rows['Oranges']['In_Stock'];
    echo $all_rows['Oranges']['On_order'];

}

我可以通过调用行号来打印数据,但数据并不总是相同,因此需要根据第一列中的标题进行打印。

将已打印的数组添加为已请求:

Array
(
[0] => Array
    (
        [Food] => Apples
        [In_Stock] => 6329
        [On_Order] => 375
    )

[1] => Array
    (
        [Food] => Pears
        [In_Stock] => 3329
        [On_Order] => 275
    )

[2] => Array
    (
        [Food] => Oranges
        [In_Stock] => 629
        [On_Order] => 170
    )
  ) 

Encase其他人需要它,这就是我使用的:

$csv = array();
foreach ($all_rows as $row) {
if($row) {
    foreach($row as $key => $val) {

        $csv[$val]['In_Stock'] = $row["In_Stock"];
        $csv[$val]['On_order'] = $row["On_order"];

    }
}
}

3 个答案:

答案 0 :(得分:0)

试试这个,

foreach ($all_rows as $key => $value) {
  echo $value['food'] . "\n";
  echo $value['In_Stock'] . "\n"

}

答案 1 :(得分:0)

您需要第二个foreach来实现您想要的目标。

这样的事情:

foreach ($all_rows as $row) {
    if($row) {
        foreach($row as $key => $val) {
            if($key == "Food" && $val == "Apples") {
                echo "Apples: " . "<br>";
                echo $row["In_Stock"] . "<br>";
                echo $row["On_order"] . "<br>";
            }
            else if($key == "Food" && $val == "Oranges") {
                echo "Oranges: " . "<br>";
                echo $row["In_Stock"] . "<br>";
                echo $row["On_order"] . "<br>";
            }
        }
    }
}

如果您只想打印页面上的值,可以这样做。

但是我已经提到过根据食物类型调用值,你可以创建一个函数。

答案 2 :(得分:0)

我认为你正在考虑具体。根据您的建议要求,如果您决定出售土豆会发生什么。您必须修改所有代码。

您需要更改的是打印循环。

所以使用这个csv文件

FOOD,IN_Stock,On_Order
Apples,1302,2304
Oranges,4356,335

你会得到

$csv_file = 'file.csv';

$all_rows = array();

$header = null;//null; // has header
if (($handle = fopen($csv_file, "r")) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
        if ($header === null) {
            $header = $row;
            continue;
        }
        $all_rows[] = array_combine($header, $row);
    }

    fclose($handle);
}
print_r($all_rows);

foreach ($all_rows as $stock_item) {

    foreach ($stock_item as $key => $val){
        if ( $key == 'FOOD') {
            echo sprintf("\n%s", $val);
        } else {
            echo sprintf(' %s = %s', $key, $val);
        }

    }
}

结果将是

Apples IN_Stock = 1302 On_Order = 2304
Oranges IN_Stock = 4356 On_Order = 335

如果你然后将土豆添加到csv

FOOD,IN_Stock,On_Order
Apples,1302,2304
Oranges,4356,335
Potatoes,3333,999

没有更改代码,您的输出将是

Apples IN_Stock = 1302 On_Order = 2304
Oranges IN_Stock = 4356 On_Order = 335
Potatoes IN_Stock = 3333 On_Order = 999

当然,您可能希望以不同方式格式化输出。