PHP数组与数组(2D数组?)到CSV

时间:2018-11-01 10:42:14

标签: php arrays laravel csv

我正在尝试从其中包含一些数据和另一个数组的数组创建CSV。

代码:

public function exportCSV()
{
    $user = Auth::user();
    $company = $user->company;
    $dealers = $company->dealers;

    $formatted_dealers = [];

    foreach ($dealers as $dealer) {
        if($dealer->is_deleted == 0){
          array_push($formatted_dealers, $dealer);
        }
    }

    if(count($formatted_dealers) > 0){
        $csvData = array('name,phone,email,is_active,streetname,number,zip,city,special_id,products');
        foreach($formatted_dealers as $dealer){
            $products = [];
            foreach ($dealer->products as $product) {
              array_push($products, $product->slug);
            }
            $products = json_encode($products);
            $csvData[] = $dealer->name . ',' . $dealer->phone . ',' . $dealer->email . ',' . $dealer->is_active . ',' . $dealer->address->streetname . ',' . $dealer->address->number . ',' . $dealer->address->zip . ',' . $dealer->address->city . ',' . $dealer->special_id . ',' . $products;
        }

        $new_time = date('d-m-Y h:i:s', strtotime('+2 hours'));
        $filename = $new_time . '.csv';
        $file_path = base_path() . '/' . $filename;
        $file = fopen($file_path,'w+');
        foreach ($csvData as $exp_data){
          fputcsv($file, explode(',', $exp_data));
        }
        fclose($file);

        $headers = ['Content-Type' => 'application/csv'];

        return response()->download($file_path, $filename, $headers)->deleteFileAfterSend(true);
    } else {
        return redirect()->route('dealers.index', ['export' => 'error']);
    }
}

因此,我有一些数据,例如经销商名称,电话等以及经销商拥有的一系列产品。我的想法是对products数组进行json_encode,然后附加到被推到csvData数组的字符串中。但是我这样做的结果是:

name,phone,email,is_active,streetname,number,zip,city,special_id,products
"Some name",11111111,example@example.com,1,xxxx,x,xxxx,xxxxxxxx,96548,"[""nBuGbW""","""qP3DAF""]"
"Another name",22222222,anoter@example.com,0,xxxxxxxx,x,xxxx,xxxxxx,,"[""nBuGbW""","""IRTQBN""]"

products json数组太多”,我似乎无法弄清楚原因。 有什么想法吗?

在我的脑海中应该是这样的:

name,phone,email,is_active,streetname,number,zip,city,special_id,products
"Some name",11111111,example@example.com,1,xxxx,x,xxxx,xxxxxxxx,96548,["nBuGbW","qP3DAF"]"
"Another name",22222222,anoter@example.com,0,xxxxxxxx,x,xxxx,xxxxxx,,["nBuGbW","IRTQBN"]"

2 个答案:

答案 0 :(得分:1)

问题是您正在手动构建-无效-csv:

$csvData[] = $dealer->name . ',' . $dealer->phone . ',' . $dealer->email . ',' 
    . $dealer->is_active . ',' . $dealer->address->streetname . ',' . $dealer->address->number . ',' 
    . $dealer->address->zip . ',' . $dealer->address->city . ','
    . $dealer->special_id . ',' . $products;

您的$products json也将包含逗号,因此当您explode()使用逗号时,您的数据都被弄乱了,并且您使json失效了:

foreach ($csvData as $exp_data) {
    // Here you break your json data
    fputcsv($file, explode(',', $exp_data));
}

您应该改用多维数组,从而避免爆炸:

$csvData[] = [
    $dealer->name,
    ...
    $products,
];

和:

foreach ($csvData as $exp_data) {
    fputcsv($file, $exp_data);
}

请注意,使其成为有效的csv,将导致转义例如双引号。因此,它在某种程度上仍然看起来很奇怪:-)

答案 1 :(得分:0)

这应该是一个注释,但是它有点长(正如jeroen所说,您要问的问题是对CSV数据进行了双重编码)。

  

我的思路是对products数组进行json_encode编码,然后附加到字符串中

因此,您很容易发明自己的编码系统-这意味着您可以控制同时编码和解码数据的代码。但是为什么要将数据写入平面文件?

如果您使用平面文件作为数据库,那么您将痛苦不堪。至少在过去40年中,程序员一直在使用Oracle,MySQL,MongoDB,Redis ....是有原因的。

另一方面,如果您尝试实现一种将数据发布到应用程序的不同实例(确实使用适当的DB)的方法,那么可以有很多更好的方法。

如果您要发布数据供其他人使用,那么您就不应该发明编码。

这看起来像XY问题。