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

PHP CSV到具有行标题的关联数组,php,arrays,csv,multidimensional-array,associative-array,Php,Arrays,Csv,Multidimensional Array,Associative Array,我有一个CSV文件,列和行中都有标题,这是我作为关联数组所需要的,我尝试过的示例对我来说并不适用 我找到的最接近的例子是,但我无法打印数据,所以我肯定遗漏了什么 任何帮助都将不胜感激 $all_rows = array(); $header = 1;//null; // has header if (($handle = fopen($csv_file, "r")) !== FALSE) { while (($row = fgetcsv($handle, 1000, ",")) !==

我有一个CSV文件,列和行中都有标题,这是我作为关联数组所需要的,我尝试过的示例对我来说并不适用

我找到的最接近的例子是,但我无法打印数据,所以我肯定遗漏了什么

任何帮助都将不胜感激

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

    }
}
}
试试这个

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

}

您需要第二个
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>";
            }
        }
    }
}
foreach($row为所有行){
如果($行){
foreach($key=>$val的行){
如果($key==“Food”&&$val==“Apples”){
回声“苹果:”
“; echo$行[“库存”]。“
”; echo$row[“按订单”]。“
”; } 如果($key==“Food”和&$val==“Oranges”){ 回声“橙子:”
”; echo$行[“库存”]。“
”; echo$row[“按订单”]。“
”; } } } }
如果您只想打印页面上的值,这可以做到


但我想既然你提到了只调用基于食物类型的值,你就可以从中创建一个函数。

我想你是在考虑具体地调用它。根据您的建议要求,如果您决定出售土豆,会发生什么情况。你必须修改你所有的代码

您需要更改的是打印循环

所以使用这个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
Apples IN_Stock = 1302 On_Order = 2304
Oranges IN_Stock = 4356 On_Order = 335
Potatoes IN_Stock = 3333 On_Order = 999
如果你在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
Apples IN_Stock = 1302 On_Order = 2304
Oranges IN_Stock = 4356 On_Order = 335
Potatoes IN_Stock = 3333 On_Order = 999

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

在此处显示打印($all_行)打印($header)数组([0]=>食品[1]=>库存[2]=>订购)OP为什么要“尝试此代码”?一个好的答案总是会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了未来的访客,以便他们可以找到这个问题并阅读你的答案。这让我很接近,只是对它进行了一点修改,以填充所有的“食物”:$csv=array();foreach($row为所有行){if($row){foreach($row为$key=>$val){$csv[$val]['In_Stock']=$row[“In_Stock”];$csv[$val]['On_order']=$row[“On_order”];}}@JamesParry Cool!很高兴它有帮助!