企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # Laravel Collection sum 求价格总和 单独创建项目名称:collections,可以是空文件夹 终端进入目录使用composer安装package 终端执行命令,引入collection `composer require illuminate/support` 终端执行命令,单独引入dump,dd等方法的package `composer require pandeydip/dump-die` PS:基本上到达这一步就就可以单独实现视频中效果,如果是中途加入的这两个package,那么需要在终端执行命令`composer dump-autoload`,更新一下自动加载环境 模拟创建index ~~~ require __DIR__ . '/vendor/autoload.php'; $orders = [[ 'id' => 1, 'user_id' => 1, 'number' => '13908080808', 'status' => 0, 'fee' => 10, 'discount' => 44, 'order_products'=> [ ['order_id'=>1,'product_id'=>1,'param'=>'6寸','price'=>555.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]], ['order_id'=>1,'product_id'=>1,'param'=>'7寸','price'=>333.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]], ], ]]; $price = 0; foreach( $orders as $order ){ foreach( $order['order_products'] as $order_product ){ $price += $order_product['price']; } } dump( $price ); ~~~ # 第一种 使用collection中提供的map方法,返回大数组中的子数组【打印出来的是一个索引的三维数组】 ~~~ dump( collect( $orders )->map(function($order){ return $order['order_products']; }) ); ~~~ 然后我们可以利用collection提供的flatten方法,将现在出现的数组直接变成items下的平级数组【其实打印出来就是一个索引的二维数组】 ~~~ dump( collect( $orders )->map( function( $order ){ return $order['order_products']; } )->flatten(1) ); ~~~ 继续使用map方法,然后返回`$order['price']`,那么打印出来的将会是纯price值的索引数组,这样就可以顺利计算价格的总和了 ~~~ dump( collect( $orders )->map( function( $order ){ return $order['order_products']; } )->flatten(1)->map( function( $order ){ return $order['price']; } ) ); ~~~ 使用sum方法计算出价钱的总和 ~~~ dump( collect( $orders )->map( function( $order ){ return $order['order_products']; } )->flatten(1)->map( function( $order ){ return $order['price']; } )->sum() ); ~~~ 上面描述步骤,算是使用的第一方案完成。代码体比两层foreach要大,下面记录使用的第二种方案,更简洁 # 第二种 使用flatMap方法,替换第一行的map flatMap 对集合内所有子集遍历执行回调,并在最后转为一维集合: ~~~ collect( $orders )->flatMap( function( $order ){#代码体 ~~~ 使用pluck方法传入要操作的key:price pluck 获取集合中指定「键」所有对应的值 ~~~ dump( collect( $orders )->flatMap( function( $order ){ return $order['order_products']; } )->pluck('price')->sum() ); ~~~ 当然如果不使用pluck方法的话可以直接传参到sum方法中 ~~~ dump( collect( $orders )->flatMap( function( $order ){ return $order['order_products']; } )->sum('price') ); ~~~ # 第三种 ~~~ dump(collect($orders)->pluck('order_products.*.price')->flatten(1)->sum()); ~~~ # 第四种 ~~~ collect( data_get($orders, '*.order_products.*.price') )->sum()); ~~~