下面是我要上传的excel表,我想读取这样的数据:
'sn' => 1,
'surname' => 'amadien',
'fname' => 'Franklyn',
'oname' => null,
'reg_no' => '3030421470HG',
'subject' =>[
'mathematics' => [5, 12, 64],
'english_language' => [5, 6, 55],
'christian_religious_studies' => [6, 13, 48]
'agricultural_science' => [4, 18, 64]
]
代码:
try {
Excel::load($request->file('result-file'), function ($reader) {
foreach ($reader->toArray() as $row) {
dd($row);
//User::firstOrCreate($row);
}
});
session()->flash('success', 'Users uploaded successfully.');
return back();
} catch (\Exception $e) {
session()->flash('error', $e->getMessage());
return back();
}
但到目前为止,我还没有。感谢
答案 0 :(得分:1)
您的第一个数组包含空值的原因是因为Excel阅读器逐行读取您的工作表。
第一行(标题除外)有sn
,surname
等空单元格,而您想要的值实际上位于第二(第三)行。
您的第二个问题是您的标题至少包含subject
次4次,而读者会将其合并为一个标题。
理想情况下,您需要重新格式化电子表格。如果可能的话,请标题为:
sn
surname
fname
oname
reg_no
mathematics
english_language
(依此类推)。
将您的行设为:
1
surname
forename
oname
12345
5, 12, 64
5, 6, 55
(依此类推)。
请注意我是如何将单个单元格中每个主题的分数组合在一起的,用逗号分隔。
现在你将得到一个与此相似的数组:
'sn' => 1,
'surname' => 'amadien',
'fname' => 'Franklyn',
'oname' => null,
'reg_no' => '3030421470HG',
'mathematics' => '5, 12, 64',
'english_language' => '5, 6, 55',
如果您希望您的主题仍然在嵌套数组中,您可以这样做:
$subjects = array_only($row, ['mathematics', 'english_language', ...]);
foreach ($subjects as $subject => $scores) {
$subjects[$subject] = explode(',', $scores);
}
$row['subjects'] = $subjects;
如果不可以更改电子表格的格式,则需要将两行组合在一起。
假设行总是成对出现,您可以使用array_chunk在一个集合中获取所需的两个数组(每行一个),然后通过构建新数组映射并组合结果。< / p>
例如:
$rows = array_chunk($rows, 2);
array_map(function ($subset) {
return [
'sn' => $subset[0]['sn'],
'surname' => $subset[0]['surname'],
'fname' => $subset[0]['fname'],
'subjects' => [
...
]
];
}, $rows);
但是,这很快就会变得混乱。表单的格式可能完全不适合您要实现的目标。