我正在尝试从其中包含一些数据和另一个数组的数组创建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"]"
答案 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问题。