将CSV文件导入数组

时间:2018-11-06 07:56:18

标签: php csv

感谢您的回复。我会尝试一下并更新我的问题,我有自己的代码,但显示全部内容有点混乱。我的问题是索引不正确。

我使用:

$products = array();
$lines = file('data_stock.csv', FILE_IGNORE_NEW_LINES);

foreach ($lines as $key => $value)
{
$products[$key] = str_getcsv($value);
}

我设法读取数据,但这会给我一个错误:

 if ((int)$products[$_sku] > 0 && isset($products[$_sku])) {

错误:注意:未定义索引:test-product-1 in .... “ test-product-1”来自csv文件中的sku列

输出

echo '<pre>';
print_r($products);
echo '</pre>';

给予:

Array
(
[0] => Array
    (
        [0] => sku
        [1] => qty
    )

[1] => Array
    (
        [0] => test-product-1
        [1] => 3
    )

[2] => Array
    (
        [0] => test-product-2
        [1] => 6
    )

[3] => Array
    (
        [0] => test-product-3
        [1] => 30
    )

)

我正在尝试使用csv文件导入到阵列中进行替换

$products = [
'test-product-1' => 3,
'test-product-2' => 6,
'test-product-3' => 30
];

但是,当我从CSV文件导入时,无法生成相同的数组,这会导致问题。 CSV数组示例:http://php.net/manual/en/function.str-getcsv.php

CSV文件:

sku,qty
test-product-1,3
test-product-2,6
test-product-3,30

下一步是扩展脚本以处理价格。我还需要能够从CSV文件中提取这些变量。并在for循环中使用它们。

sku,qty,price,special_price
test-product-1,3,100,50
test-product-2,6,99,
test-product-3,30,500,300

2 个答案:

答案 0 :(得分:0)

我在项目中使用了以下代码,它对我来说很好用。

我使用了csv_reader PHP库。 您必须将此库放在库文件夹中,然后将其导入要读取csv的文件中。

include_once('../csv_reader.php');

    $read = new CSV_Reader;

    $read->strFilePath = "file_name_with_path";
    $read->strOutPutMode = 0;  // 1 will show as HTML 0 will return an array

    $read->setDefaultConfiguration();
    $read->readTheCsv();
    $dataArr = array();
    $dataArr = $read->arrOutPut;

$dataArr中,我会得到结果,

答案 1 :(得分:0)

我认为问题在于,当您存储行时,您存储的行将由行号索引({$key将是文件中的行号)。相反,我认为您想按CSV文件的第一列对其进行索引。因此,首先提取数据(就像已经使用str_getcsv()一样,然后在第一列([0]处索引)...

$products = array();
$lines = file('data_stock.csv', FILE_IGNORE_NEW_LINES);

foreach ($lines as $value)
{
    $data = str_getcsv($value);
    $products[$data[0]] = $data;
}

如果要添加第一行作为标题并使用它来键入数据...

$products = array();
$lines = file('data_stock.csv', FILE_IGNORE_NEW_LINES);
$headers = str_getcsv(array_shift($lines));

$products = array();
foreach ( $lines as $value )    {
    $data = str_getcsv($value);
    $products[$data[0]] = array_combine($headers, $data);
}

使用array_shift()删除数组的第一行,然后使用array_combine()中的这一行作为每一行的键。有了测试数据,您将得到类似...

Array
(
    [test-product-1] => Array
        (
            [sku] => test-product-1
            [qty] => 3
            [price] => 100
            [special_price] => 50
        )