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.
Related
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.
I have these two arrays:
Page Views
array:5 [▼
0 => array:3 [▼
"lp_group" => "store"
"hour" => 15
"views" => 1
]
1 => array:3 [▼
"lp_group" => "teaser"
"hour" => 15
"views" => 2
]
2 => array:3 [▼
"lp_group" => "store"
"hour" => 17
"views" => 1
]
3 => array:3 [▼
"lp_group" => "teaser"
"hour" => 17
"views" => 3
]
4 => array:3 [▼
"lp_group" => "store"
"hour" => 21
"views" => 1
]
]
Button Clicks
array:3 [▼
0 => array:3 [▼
"lp_group" => "store"
"hour" => 15
"clicks" => 3
]
1 => array:3 [▼
"lp_group" => "teaser"
"hour" => 15
"clicks" => 3
]
2 => array:3 [▼
"lp_group" => "teaser"
"hour" => 17
"clicks" => 1
]
]
I'd like to get this:
array:5 [▼
0 => array:3 [▼
"lp_group" => "store"
"hour" => 15
"views" => 1
"clicks" => 3
]
1 => array:3 [▼
"lp_group" => "teaser"
"hour" => 15
"views" => 2
"clicks" => 3
]
2 => array:3 [▼
"lp_group" => "store"
"hour" => 17
"views" => 1
]
3 => array:3 [▼
"lp_group" => "teaser"
"hour" => 17
"views" => 3
"clicks" => 1
]
4 => array:3 [▼
"lp_group" => "store"
"hour" => 21
"views" => 1
]
]
In case you don't see it, one of the arrays (for each hour/lp_group) counts views the other clicks. I'd like to render these in a table, so I need to "combine" them into one array.
Neither array_merge nor array_merge_recursive work properly. And all the others I've tried overwrite data.
Define your two arrays as $ar1 and $ar2 and try code below:
$ar = array_map(function ($ar1, $ar2){
if ($ar1['lp_group'] == $ar2['lp_group'] && $ar1['hour'] == $ar2['hour']) {
$ar1['clicks'] = $ar2['clicks'];
}
return $ar1;
}, $ar1, $ar2);
I have a very complex problem, I have products and modifiers, and also title of the modifiers, I want to store into array the title, product id and modifiers, the way of storing is if the title is the same and the product id the same then store into array and so on for others, after that I want in blade to display product id without repeat the same product id and under it the modifier title without repeat as if i want to use groupby and under the title to show the modifiers, I tried this code but it shows every title in one array, I hope you got what I need sorry for my bad language, please note that Im new to laravel so would be great if you help me to show the result in the blade view, thank you in adavance
$customizeorders = OrderCustomize::where('userorder_id',$order_number)->with('customizeproduct')->get();
$wholeData = [];
$wrapper = [];
$previousTitle = $customizeorders[0]->customizeproduct->customizetitle->name;
$previousProduct = $customizeorders[0]->product_id;
foreach ($customizeorders as $data) {
$singleItem = [];
if ( ($data->customizeproduct->customizetitle->name == $previousTitle) AND ($data->product_id == $previousProduct) ) {
$title = $data->customizeproduct->customizetitle->name;
$product = $data->product_id;
$modifiers = $data->customizeproduct->customize_title;
array_push($singleItem, $title, $product, $modifiers);
array_push($wrapper, $singleItem);
} else {
$previousTitle = $data->customizeproduct->customizetitle->name;
$previousProduct = $data->product_id;
$modifiers = $data->customizeproduct->customize_title;
$title = $data->customizeproduct->customizetitle->name;
$product = $data->product_id;
$modifiers = $data->customizeproduct->customize_title;
array_push($singleItem, $title, $product, $modifiers);
array_push($wrapper, $singleItem);
}
array_push($wholeData, $wrapper);
$wrapper = [];
}
The result:
array:13 [▼
0 => array:1 [▼
0 => array:3 [▼
0 => "TELL US IF YOU'LL NEED"
1 => 2606
2 => "Napkins"
]
]
1 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2610
2 => "Sausage"
]
]
2 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2610
2 => "Bacon"
]
]
3 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2610
2 => "Onions"
]
]
4 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2610
2 => "Hot Giardiniera"
]
]
5 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2610
2 => "Garlic"
]
]
6 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2610
2 => "BBQ Sauce"
]
]
7 => array:1 [▼
0 => array:3 [▼
0 => "SELECT SODA TYPES"
1 => 2662
2 => "Assorted Regular Sodas"
]
]
8 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2618
2 => "Grilled Chicken"
]
]
9 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2618
2 => "Anchovies"
]
]
10 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2618
2 => "Black Olives"
]
]
11 => array:1 [▼
0 => array:3 [▼
0 => "ADD TOPPINGS"
1 => 2618
2 => "Pepperoni"
]
]
12 => array:1 [▼
0 => array:3 [▼
0 => "TELL US IF YOU'LL NEED"
1 => 2618
2 => "Napkins"
]
]
]
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
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;
});
})