Laravel, store into array the similar items - php

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"
]
]
]

Related

how to get first key (0 or associative ) form array and output in new array

I Would Like To Get The First Element Of This Array And Put In New Same Array Output
One Requirement: It Cannot Be Done With Passing By reference Index eg 0
This Input Array
[ 'id','ID','dt-text' ] ,
[ 'name','Name','dt-text' ] ,
[ 'artistList'=>['list','mm','defalut'] ,'Artist List','dt-select'] ,
[ 'nationality'=>['nationality','mm','defalut'] ,'Nationality','dt-select'] ,
[ 'view','View',''],
[ 'status','Status' ,'']
array:6 [▼
0 => array:3 [▼
0 => "id"
1 => "ID"
2 => "dt-text"
]
1 => array:3 [▼
0 => "name"
1 => "Name"
2 => "dt-text"
]
2 => array:3 [▼
"artistList" => array:3 [▼
0 => "list"
1 => "mm"
2 => "defalut"
]
0 => "Artist List"
1 => "dt-select"
]
3 => array:3 [▼
"nationality" => array:3 [▼
0 => "nationality"
1 => "mm"
2 => "defalut"
]
0 => "Nationality"
1 => "dt-select"
]
4 => array:3 [▼
0 => "view"
1 => "View"
2 => ""
]
5 => array:3 [▼
0 => "status"
1 => "Status"
2 => ""
]
]
The New Array I Needed
This IS OutPUT Array
['id','name','artistList'=>['list','mm','defalut'] ,'nationality'=>['nationality','mm','defalut'] ,'view','status']
array:6 [▼
0 => "id"
1 => "name"
"artistList" => array:3 [▼
0 => "list"
1 => "mm"
2 => "defalut"
]
"nationality" => array:3 [▼
0 => "nationality"
1 => "mm"
2 => "defalut"
]
2 => "view"
3 => "status"
]
Note
I Can Controll in Input Array Same , I Try with foreach in php And Tray In Laravel Helper Function head Put I get S
array:6 [▼
0 => "id"
1 => "name"
2 => array:1 [▼
"artistList" => array:3 [▼
0 => "list"
1 => "mm"
2 => "defalut"
]
]
3 => array:1 [▼
"nationality" => array:3 [▼
0 => "nationality"
1 => "mm"
2 => "defalut"
]
]
4 => "view"
5 => "status"
]
Put I Cant Get Resslut So , How Can I Do this?
Since you are changing the keys (structure) of the array, there is no way to do that without either generating a new array or passing the array by reference. One way to do it by generating a new array is with array_reduce:
$array = [
[ 'id','ID','dt-text' ] ,
[ 'name','Name','dt-text' ] ,
[ 'artistList'=>['list','mm','defalut'] ,'Artist List','dt-select'] ,
[ 'nationality'=>['nationality','mm','defalut'] ,'Nationality','dt-select'] ,
[ 'view','View',''],
[ 'status','Status' ,'']
];
$array = array_reduce($array, function ($c, $v) {
$first_key = array_keys($v)[0];
return array_merge($c, array($first_key => $v[$first_key])); }, []);
print_r($array);
Output:
Array (
[0] => id
[1] => name
[artistList] => Array (
[0] => list
[1] => mm
[2] => defalut
)
[nationality] => Array (
[0] => nationality
[1] => mm
[2] => defalut
)
[2] => view
[3] => status
)
Demo on 3v4l.org

Merging elements of two different arrays to third array [duplicate]

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

Need to make new array

Need Help to make new array using two array.
One array is
array:2 [▼
"Date Date 2018-07-23" => array:1 [▼
6 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
]
"Date Date 2018-07-28" => array:3 [▼
1 => array:2 [▼
"avg" => 0.031472222222222
"line_n0" => 1
]
4 => array:2 [▼
"avg" => 0.011111111111111
"line_n0" => 4
]
5 => array:2 [▼
"avg" => 0.011111111111111
"line_n0" => 5
]
]
]
and another array is
array:6 [▼
1 => array:2 [▼
"avg" => 0
"line_n0" => 1
]
2 => array:2 [▼
"avg" => 0
"line_n0" => 2
]
3 => array:2 [▼
"avg" => 0
"line_n0" => 3
]
4 => array:2 [▼
"avg" => 0
"line_n0" => 4
]
5 => array:2 [▼
"avg" => 0
"line_n0" => 5
]
6 => array:2 [▼
"avg" => 0
"line_n0" => 6
]
array:2 [▼
"Date Date 2018-07-23" => array:1 [▼
1 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
2 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
3 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
4 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
5 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
6 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
]
"Date Date 2018-07-28" => array:3 [▼
1 => array:2 [▼
"avg" => 0.031472222222222
"line_n0" => 1
]
2 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
3 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
4 => array:2 [▼
"avg" => 0.011111111111111
"line_n0" => 4
]
5 => array:2 [▼
"avg" => 0.011111111111111
"line_n0" => 5
]
6 => array:2 [▼
"avg" => 0.0
"line_n0" => 6
]
]
]
Please help me how i will combine the array ,I want to push 2nd array element if not fund in first array key.I trying but not clear to make new array. I have tried array merge and array combine but not clear to make this new array.
Use array_merge() function Example below
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>
Output like this:
Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => trapezoid
[4] => 4
)

Merge ids and sum values of two collections of arrays in Laravel

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;
});
})

Reducing and combining array

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.

Categories