i have an array that contains another array and i wanna get specifics elements sum
Array
array:1 [▼
0 => array:3 [▼
"shop_id" => 1
"delegate_id" => 2
"items" => array:3 [▼
0 => array:3 [▼
"product_id" => 2
"price" => 4.75
"quantity" => 1
]
1 => array:3 [▼
"product_id" => 6
"price" => 18.5
"quantity" => 1
]
2 => array:3 [▼
"product_id" => 10
"price" => 88
"quantity" => 2
]
]
]
]
i need to get the sum of price
any ideas to do this?
If there is relationships there is a better approach. As the data you have given you could call sum twice and make it work.
collect($array)->sum(function (array $shop) {
return collect($shop['items'])->sum('price');
});
This will sum each individual shop and the sum amount would be the sum of each shops items.
Related
This question already has answers here:
Merge rows of data from two 2D arrays (each with a shared and a unique column) based on the shared column value
(3 answers)
Closed 5 months ago.
I wish you could help me ...
I have 2 arrays, which I would like to insert into a 1array, by new_date to which if there is no data is data = '0', if there is no data1 is data1 = '0'.
Sorry if I do not know how to explain it well, I gave a small example. I have already tried array_merge (but everything is separate) and array_combine (it gives an error of Both parameters should have an equal number of elements).
Thank you in advance for all the help you can give ...
array1 = array:5 [▼
0 => array:2 [▼
"data" => 118
"new_date" => "06-2017"
]
1 => array:2 [▼
"data" => 263
"new_date" => "07-2017"
]
2 => array:2 [▼
"data" => 264
"new_date" => "08-2017"
]
3 => array:2 [▼
"data" => 266
"new_date" => "09-2017"
]
4 => array:2 [▼
"data" => 306
"new_date" => "10-2017"
]
5 => array:2 [▼
"data" => 100
"new_date" => "11-2017"
]
array2 = array:6 [▼
0 => array:2 [▼
"data1" => 100
"new_date" => "02-2016"
]
1 => array:2 [▼
"data1" => 170
"new_date" => "06-2017"
]
2 => array:2 [▼
"data1" => 354
"new_date" => "07-2017"
]
3 => array:2 [▼
"data1" => 397
"new_date" => "08-2017"
]
4 => array:2 [▼
"data1" => 421
"new_date" => "09-2017"
]
5 => array:2 [▼
"data1" => 531
"new_date" => "10-2017"
]
Exemple:
array3 = array:7 [▼
0 => array:3 [▼
"data1" => 111
"data" => 0
"new_date" => "02-2016"
]
1 => array:3 [▼
"data1" => 170
"data" => 118
"new_date" => "06-2017"
]
2 => array:3 [▼
"data1" => 354
"data" => 263
"new_date" => "07-2017"
]
3 => array:3 [▼
"data1" => 397
"data" => 264
"new_date" => "08-2017"
]
4 => array:3 [▼
"data1" => 421
"data" => 266
"new_date" => "09-2017"
]
5 => array:3 [▼
"data1" => 531
"data" => 306
"new_date" => "10-2017"
]
6 => array:3 [▼
"data1" => 0
"data" => 100
"new_date" => "11-2017"
]
Use array_combine to set the new_date as keys. Then add the first array element the d1 (as "data1" in your example) with array_map. Finely, loop on second array and add d1 is exist and all the rest with d ("data" in your example) as 0 if not.
You can do it like this:
$a1 = array(["d"=>1, "new_date"=> "06-2017"],["d"=>2, "new_date"=> "02-2016"]);
$a2 = array(["d1"=>3, "new_date"=> "06-2017"],["d1"=>4, "new_date"=> "07-2017"]);
$a1 = array_combine(array_column($a1, "new_date"), $a1);
$a2 = array_combine(array_column($a2, "new_date"), $a2);
// adding default d1 as 0
$a1 = array_map(function ($e) {return array_merge($e, ["d1" => 0]);},$a1);
foreach($a2 as $k => $v) {
if (isset($a1[$k]))
$a1[$k]["d1"] = $v["d1"]; // if new_data exist set only d1
else
$a1[$k] = array_merge($v, ["d" => 0]); //add with d as 0
}
Your result will be in $a1
So I have a JSON array with some content in the array. each item has product id and price, my aim is to loop through this array, and modify the product price and return array with modified product price.
here is the json array snippet in result/
"variation_combination_price" => array:4 [▼
0 => array:10 [▼
"id" => 1
"product_id" => 1364
"cost_price" => 600
"promo_price" => 900
"price" => 900
"combination_array" => array:2 [▼
0 => array:8 [▶]
1 => array:8 [▶]
]
"combination_array_string" => "{"1":"3","2":"4"}"
"quantity" => 10000
"status" => 1
"DOCUMENTATION" => array:2 [▶]
]
1 => array:10 [▶]
2 => array:10 [▶]
3 => array:10 [▶]
So the result above is the original response. As you can see we have 4 items there, the aim is to loop though them, modify the price and return same 4 items.
foreach ($product_data['variation_combination_price'] as
$variation_combination_price){
$variation_combination_price['price'] = 666;
$product_data['variation_combination_price'] =
$variation_combination_price;
}
dd($product_data['variation_combination_price']);
My result should come with the same array where price is modified.
"variation_combination_price" => array:4 [▼
0 => array:10 [▼
"id" => 1
"product_id" => 1364
"cost_price" => 600
"promo_price" => 900
"price" => 666
"combination_array" => array:2 [▼
0 => array:8 [▶]
1 => array:8 [▶]
]
"combination_array_string" => "{"1":"3","2":"4"}"
"quantity" => 10000
"status" => 1
"DOCUMENTATION" => array:2 [▶]
]
1 => array:10 [▶]
2 => array:10 [▶]
3 => array:10 [▶]
You are not looping by reference.
Whatever changes you do in the loop will not change the value of the array.
In order to do so you need to add a &
foreach ($product_data['variation_combination_price'] as &$variation_combination_price){
$variation_combination_price['price'] = 666;
}
Just remember to unset the variable after the loop also.
unset($variation_combination_price);
To make sure you don't change the array data after the loop is done.
I have the following arrays:
array:2 [▼
0 => array:2 [▼
"id" => 3
"total" => 2
]
1 => array:2 [▼
"id" => 4
"total" => 1
]
]
and
array:2 [▼
0 => array:2 [▼
"id" => 3
"total" => 5
]
1 => array:2 [▼
"id" => 4
"total" => 5
]
2 => array:2 [▼
"id" => 5
"total" => 2
]
]
I need to merge them together, keeping ids and summing the results, so I would get the resulting array as:
array:2 [▼
0 => array:2 [▼
"id" => 3
"total" => 7
]
1 => array:2 [▼
"id" => 4
"total" => 6
]
2 => array:2 [▼
"id" => 5
"total" => 2
]
]
These arrays come from a laravel database query using the toArray() method, so answers containing laravel default collection methods are welcome too.
try this
arr3 = arr1->merge(arr2);
arr3->map(function(itemM)use(arr1, arr2){
return itemM->total = arr1->sum(function(itemS)use(itemM){
return itemS->id == itemM->id ? itemS->total : 0;
}) +
arr2->sum(function(itemS)use(itemM){
return itemS->id == itemM->id ? itemS->total : 0;
});
})
I have a multidimensional array as
array:3 [▼
0 => array:3 [▼
"product_id" => "8"
"qty" => 1
]
1 => array:3 [▼
"product_id" => "9"
"qty" => 2
]
]
and I would like to merge a static associative array ['invoice_id' => 1] in to all the arrays in the multidimensional array. and the end result should be something like this
array:3 [▼
0 => array:3 [▼
"product_id" => "8"
"qty" => 1,
"invoice_id" => 1
]
1 => array:3 [▼
"product_id" => "9"
"qty" => 2,
"invoice_id" => 1
]
]
is there a way to do this with out looping through the multidimensional array
Try using Array_Map
suppose Array data store in $testArray variable
$testArray= array_map(function($arr){
return $arr + ['invoice_id' => 1];
}, $testArray);
I am trying to create an array that succinctly gives me the following:
ID of a component part
ID of the supplier for that component part
The volume breakpoints, and their associated unit costs
I am using Laravel 5.2, although this is a more general PHP question.
So, I have a database table that looks like this:
I have a function, as below, to get some prices of components:
public function get_component_prices()
{
$components = DB::table('component_supplier')
->select('component_id', 'supplier_id', 'volume', 'unit_cost')
->get();
$prices = [];
foreach ($components as $component) {
array_push($prices, ["component_id" => $component->component_id, "supplier_id" => $component->supplier_id, "volumes" => [$component->volume => $component->unit_cost]]);
}
dd($prices);
}
This gives me the array:
array:7 [▼
0 => array:3 [▼
"component_id" => 3
"supplier_id" => 1
"volumes" => array:1 [▼
100 => "1.5000"
]
]
1 => array:3 [▼
"component_id" => 3
"supplier_id" => 1
"volumes" => array:1 [▼
207 => "1.0100"
]
]
2 => array:3 [▼
"component_id" => 3
"supplier_id" => 1
"volumes" => array:1 [▼
500 => "0.8000"
]
]
3 => array:3 [▼
"component_id" => 3
"supplier_id" => 1
"volumes" => array:1 [▼
1000 => "0.4000"
]
]
4 => array:3 [▼
"component_id" => 3
"supplier_id" => 2
"volumes" => array:1 [▼
10000 => "0.2000"
]
]
5 => array:3 [▼
"component_id" => 4
"supplier_id" => 2
"volumes" => array:1 [▼
100 => "0.1000"
]
]
6 => array:3 [▼
"component_id" => 4
"supplier_id" => 2
"volumes" => array:1 [▼
500 => "0.0700"
]
]
]
You can see that certain suppliers and components have multiple volumes.
Therefore, I'd like to try to group the array a bit better, combining the repeated parts - perhaps like so, for example:
6 => array:3 [▼
"component_id" => 4
"supplier_id" => 2
"volumes" => array:3 [▼
100 => "0.1000",
500 => "0.0700"
]
]
So that for each component_id and supplier_id group, there's a set of 'volumes'.
Any advice is much appreciated... I have been trying for hours to get the array sorted!
In Mysql, you can do something like this
SELECT component_id, supplier_id,
GROUP_CONCAT(volume, ':', unit_cost) AS volumes
FROM component_supplier
GROUP BY CONCAT(component_id, supplier_id)
http://sqlfiddle.com/#!9/cb7bb/1
Then you can simply loop this query in PHP and explode volumes field by the comma.