【问题标题】:PHP CSV to Associative Array with Row HeadingsPHP CSV 到带有行标题的关联数组
【发布时间】:2017-05-13 15:26:19
【问题描述】:

我有一个 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
    )
  ) 

装其他人需要它,这是我用的:

$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"];

    }
}
}

【问题讨论】:

  • 在这里显示 print_r($all_rows)
  • print_r($header)
  • Array ([0] => Food [1] => In_Stock [2] => On_Order )

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


【解决方案1】:

你需要第二个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>";
            }
        }
    }
}

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

但我既然你提到只根据食物类型调用值,你可以从中创建一个函数。

【讨论】:

  • 这让我很接近,只是稍微修改了一下以填充所有“食物”:$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"]; } } }
  • @JamesParry 酷!很高兴它有帮助!
【解决方案2】:

试试这个,

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

}

【讨论】:

  • 为什么 OP 应该“试试这个代码”? 好的答案将始终解释所做的工作以及这样做的原因,不仅适用于 OP,而且适用于可能会发现此问题并正在阅读您的答案的 SO 的未来访问者。
【解决方案3】:

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

你需要改变的是打印循环。

所以使用这个 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2012-09-11
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多