You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:10:23