Laravel中如何将detailItem数组转换为对象数组?
Laravel中如何将二维数组转换为对象数组
我是Laravel新手,对数组和对象的数据类型有点困惑。现在我有一个二维数组格式的data[0].detailItem:
"data[0].detailItem" => array:2 [ 0 => array:3 [ "itemNo" => "100011" "unitPrice" => 0 "quantity" => 6 ] 1 => array:3 [ "itemNo" => "102972" "unitPrice" => 0 "quantity" => 3 ] ]
想要转换成每个元素都是对象的数组:
"data[0].detailItem" => [ { "itemNo" => "100011" "unitPrice" => 0 "quantity" => 6 }, { "itemNo" => "102972" "unitPrice" => 0 "quantity" => 3 } ]
我的现有代码如下,但目前的写法无法得到想要的结果:
public function apiStore(Request $request){ $detailReceiveItem = DB::table('t_receive_item_detail')->where('receive_item_id','=',$request->idReceiveItem)->get(); $detailItem = []; foreach($detailReceiveItem as $key=>$receiveItem){ $temp = [ 'itemNo' => $receiveItem->item_code, 'unitPrice' => 0, 'quantity' => $receiveItem->qty, ]; array_push($detailItem,$temp); } $input = [ 'data[0].vendorNo' => $request->vendorNo, 'data[0].receiveNumber' => $request->receiveNumber, 'data[0].transDate' => date('d/m/Y',strtotime($request->transDate)), 'data[0].detailItem' => (object)$detailItem ]; $insertReceiveItem = Http::withHeaders([ 'Authorization' => 'Bearer '.session()->get('access_token'), 'X-Session-ID' => session()->get('X-Session-ID'), ])->asForm()->post(session()->get('host').'api url here',$input); return response()->json(['status'=>1, 'url'=>'/api-accurate/receive-item','message'=>'Receive Item Created Successfully!']); }
我需要把$detailItem转换为对象数组。
解决方案
你当前代码的问题在于(object)$detailItem是把整个数组转换成了一个对象,而不是把数组里的每个子元素转换成对象。要实现目标,需要将数组中的每个子数组单独转换为对象,有两种简单的实现方式:
方式一:在循环中直接生成对象
在遍历$detailReceiveItem时,直接将每个$temp定义为对象(可以用(object)强制转换,或者实例化stdClass):
public function apiStore(Request $request){ $detailReceiveItem = DB::table('t_receive_item_detail')->where('receive_item_id','=',$request->idReceiveItem)->get(); $detailItem = []; foreach($detailReceiveItem as $receiveItem){ // 直接将数组转换为对象后加入数组 $temp = (object)[ 'itemNo' => $receiveItem->item_code, 'unitPrice' => 0, 'quantity' => $receiveItem->qty, ]; $detailItem[] = $temp; // 替代array_push,写法更简洁 } $input = [ 'data[0].vendorNo' => $request->vendorNo, 'data[0].receiveNumber' => $request->receiveNumber, 'data[0].transDate' => date('d/m/Y',strtotime($request->transDate)), 'data[0].detailItem' => $detailItem // 这里不再需要强制转换整个数组 ]; $insertReceiveItem = Http::withHeaders([ 'Authorization' => 'Bearer '.session()->get('access_token'), 'X-Session-ID' => session()->get('X-Session-ID'), ])->asForm()->post(session()->get('host').'api url here',$input); return response()->json(['status'=>1, 'url'=>'/api-accurate/receive-item','message'=>'Receive Item Created Successfully!']); }
方式二:循环后批量转换对象
如果已经生成了二维数组,可以用array_map批量将每个子数组转换为对象:
public function apiStore(Request $request){ $detailReceiveItem = DB::table('t_receive_item_detail')->where('receive_item_id','=',$request->idReceiveItem)->get(); $detailItem = []; foreach($detailReceiveItem as $receiveItem){ $temp = [ 'itemNo' => $receiveItem->item_code, 'unitPrice' => 0, 'quantity' => $receiveItem->qty, ]; $detailItem[] = $temp; } // 批量转换每个子数组为对象 $detailItem = array_map(function($item) { return (object)$item; }, $detailItem); $input = [ 'data[0].vendorNo' => $request->vendorNo, 'data[0].receiveNumber' => $request->receiveNumber, 'data[0].transDate' => date('d/m/Y',strtotime($request->transDate)), 'data[0].detailItem' => $detailItem ]; $insertReceiveItem = Http::withHeaders([ 'Authorization' => 'Bearer '.session()->get('access_token'), 'X-Session-ID' => session()->get('X-Session-ID'), ])->asForm()->post(session()->get('host').'api url here',$input); return response()->json(['status'=>1, 'url'=>'/api-accurate/receive-item','message'=>'Receive Item Created Successfully!']); }
额外注意点
如果你的目标API需要接收JSON格式的请求体,建议将->asForm()改为->asJson(),这样Laravel会自动将数组/对象序列化为正确的JSON格式,避免表单编码带来的结构问题。
内容的提问来源于stack exchange,提问作者Tommy Saputra
相关产品推荐
相关产品推荐

