如何解决Foreach循环仅存储多维数组的第一个索引Laravel 格式为什么只返回最后一个?
我正在尝试将多维数组值保存到单独的字符串中,并将其存储在数据库中。我有以下数组: 我的回复数据:
[
{
"name": "bla bla","creator": "bla bla","cost": 200
},{
"name": "bla bla","cost": 200
}
]
我尝试了单个foreach循环(如下所示),该代码当前正在工作,但仅接受(保存)第一个索引。我几乎有1万个数据。我需要它来返回每个数组值的结果。
public function fileImport(Request $request)
{
set_time_limit(6000);
$array = (new DrugsImport)->toArray($request->file('file'));
$i = 0;
foreach ($array as $item) {
$drugs = new Drug;
$drugs->user_id = 1;
$drugs->name = $item[$i]['name'];
$drugs->cost = $item[$i]['cost'];
$drugs->save();
//$name = utf8_decode($item[$i]['naimenovaniya']);
// $name = $item[$i]['naimenovaniya'];
// iconv("Windows-1251","UTF-8",$name);
$i++;
}
return response()->json($drugs);
//Excel::import(new DrugsImport,$request->file('file')->store('temp'));
//return back();
}
当前,此代码仅存储第一个[0]元素。其余值不会保存。我还尝试了其他几种方式,但是在存储的所有第一个元素中。 我也尝试过这样:
foreach ($array as $key => $value) {
if (is_array($value)) {
......
}
}
我找不到我错了。有人可以帮忙吗? 谢谢!
已编辑
如果我使用var_dump($array)
运行:
array(1) {
[0] => array(2897) {
[0] => array(3) {
["name"] => string(36)
"bla bla bla" ["cost"] => int(200)
} [1] => array(3) {
["name"] => string(36)
"bla bla bla" ["cost"] => int(200)
} [2] => array(3) {
["name"] => string(36)
"bla bla bla" ["cost"] => int(200)
} [3] => array(3) {
["name"] => string(36)
"bla bla bla" ["cost"] => int(200)
}
....
已更新 我的药物导入文件:
class DrugsImport implements ToModel,WithheadingRow
{
use Importable;
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Drug([
'name ' => $row[0],'cost' => $row[1]
]);
}
}
如果我转储$ array,它将返回:
array:1 [▼
0 => array:2897 [▼
0 => array:3 [ …3]
1 => array:3 [ …3]
2 => array:3 [ …3]
3 => array:3 [ …3]
4 => array:3 [ …3]
....
解决方法
您可以尝试这样。 让我们知道您是否遇到错误
// controller fileImport
public function fileImport(Request $request)
{
$drug = new DrugsImport;
Excel::import($drug,$request->file('file'));
return $drug->drugResult;
}
// Drug Import
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\ToCollection;
class DrugsImport implements ToCollection,WithHeadingRow
{
public $drugResult;
public function collection(Collection $rows)
{
$this->drugResult = $rows;
}
}
,
因此,您的代码存在一些问题。
格式
您的数组是一个包含一个包含多个数组的数组的数组,因此,如果您仅这样做:
foreach ($array as $item)
它只会迭代一次(因为$array
仅包含一个数组),这就是为什么只有第一个数组的原因。
如果愿意
foreach ($array[0] as $item)
并使用$item['name']
,它将遍历所有项目。
为什么只返回最后一个?
那是因为您在每次迭代中都会覆盖$drugs
变量。
如果要全部返回,请将它们添加到数组中。应该这样做:
// Define the array where we will add the drugs so we can return them all
$listOfDrugs = [];
foreach ($array[0] as $item) {
$drug = new Drug;
$drug->user_id = 1;
$drug->name = $item['name'];
$drug->cost = $item['cost'];
$drug->save();
// Add the new drug to the array so it can be returned after the loop
$listOfDrugs[] = $drug;
}
// Now return the array with all the drugs
return response()->json($listOfDrugs);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。