array_merge_recursive on multidimensional array - php

Please how do i apply array_merge_recursive on the code below
<?php
array:4 [▼
0 => array:1 [▼
1 => "1_1"
]
1 => array:1 [▼
1 => "1_2"
]
2 => array:1 [▼
2 => "2_1"
]
3 => array:1 [▼
2 => "2_2"
]
]
?>
I need the output to be
<?php
array:2 [▼
0 => array:2 [▼
0 => "1_1",
1 => "1_2"
]
1 => array:2 [▼
0 => "2_1",
1 => "2_2"
]
]
?>
Note: the inner array might increase from 4 to 1000
Thank you.

Short and to the point.
$array = [
0 => [
0 => '1_1',
],
1=> [
0 => '1_2',
],
2 => [
0 => '2_1',
],
3 => [
0 => '2_2',
],
];
foreach(array_chunk($array, 2) as $value){
print_r(array_merge(array_shift($value), array_pop($value)));
}
Get a chunk of 2 from the big array. Loop over the chunks, get the first element in the array and the last element and merge them.
Result:
Array
(
[0] => 1_1
[1] => 1_2
)
Array
(
[0] => 2_1
[1] => 2_2
)
Remove the print_r and adapt to your own needs.
array_merge_recursive can also be used instead of array_merge but it this case it does exactly the same thing. You'd still need to somehow get the chunks.

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

php - multidimensional array (keep index array)

I have array like this:
array:2 [▼
0 => array:3 [▼
0 => array:1 [▼
"2018-06-13" => "hadir"
]
1 => array:1 [▼
"2018-06-12" => "hadir"
]
2 => array:1 [▼
"2018-06-11" => "alfa"
]
]
1 => array:3 [▼
0 => array:1 [▼
"2018-06-13" => "hadir"
]
1 => array:1 [▼
"2018-06-12" => "hadir"
]
2 => array:1 [▼
"2018-06-11" => "hadir"
]
]
]
But I want convert this array to:
array:2 [▼
0 => array:3 [▼
"2018-06-13" => "hadir"
"2018-06-12" => "hadir"
"2018-06-11" => "alfa"
]
1 => array:3 [▼
"2018-06-13" => "hadir"
"2018-06-12" => "hadir"
"2018-06-11" => "hadir"
]
]
I have tried my own solutions using things like array_merge, array_walk_recursive, and RecursiveIteratorIterator with RecursiveArrayIterator. But in my practice it doesn't work.
Help Me
Hard part was re-creating the original array :)
Loop through the top level array with a counter
Each element of that array is an indexed array. Loop through each of htem with a counter.
Each of those elements is an associative array containing the data you want to use as keys/values in the new array. Pop through each of those wtih a foreach and build the new array, top level being indexed on $i and each of those elements containing your associative array.
<?php
$arr[0][]=array('2018-06-13'=>"hadir");
$arr[0][]=array('2018-06-12'=>"hadir");
$arr[0][]=array('2018-06-11'=>"alfa");
$arr[1][]=array('2018-06-13'=>"hadir");
$arr[1][]=array('2018-06-12'=>"hadir");
$arr[1][]=array('2018-06-11'=>"hadir");
print_r($arr);
for($i=0;$i<count($arr);$i++){
for($j=0;$j<count($arr[$i]);$j++){
foreach($arr[$i][$j] as $k=>$v){
$newarr[$i][$k]=$v;
}
}
}
print_r($newarr);
?>
Here are a couple of clean/direct approaches using the splat operator (...). Both effectively "shift the deepest subarrays up a level" by merging the individual subarrays.
Code: (Demo) *use one approach or the other depending on style preference
$array = [
[
['2018-06-13' => "hadir"],
['2018-06-12' => "hadir"],
['2018-06-11' => "alfa"]
],
[
['2018-06-13' => "hadir"],
['2018-06-12' => "hadir"],
['2018-06-11' => "hadir"]
]
];
var_export(
array_reduce(
$array,
function ($carry, $item) {
$carry[] = array_merge(...$item);
return $carry;
},
[]
)
);
echo "\n---\n";
foreach ($array as &$sub1) { // modify by reference
$sub1 = array_merge(...$sub1);
}
var_export($array);
Output:
array (
0 =>
array (
'2018-06-13' => 'hadir',
'2018-06-12' => 'hadir',
'2018-06-11' => 'alfa',
),
1 =>
array (
'2018-06-13' => 'hadir',
'2018-06-12' => 'hadir',
'2018-06-11' => 'hadir',
),
)
---
array (
0 =>
array (
'2018-06-13' => 'hadir',
'2018-06-12' => 'hadir',
'2018-06-11' => 'alfa',
),
1 =>
array (
'2018-06-13' => 'hadir',
'2018-06-12' => 'hadir',
'2018-06-11' => 'hadir',
),
)

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.

Cross compare two array elements

After a lot of API calls and loops I have created an array. This array takes the following form
2 => array:3 [▼
"someInfo" => array:1 [▶]
"existingIDs" => array:1 [▼
0 => array:1 [▼
"id" => "123456"
]
]
"idList" => array:2 [▼
0 => array:1 [▼
"id" => "123456"
]
1 => array:1 [▼
"id" => "777564"
]
]
]
The part I am interested in is existingIDs and idList. The problem is that some ids are appearing in both array elements, so in the above example the id 123456 appears in both.
What I need to do is cross compare these two elements and perhaps create a new element with unique ids. So the above example may turn into something like this
2 => array:3 [▼
"someInfo" => array:1 [▶]
"existingIDs" => array:1 [▼
0 => array:1 [▼
"id" => "123456"
]
]
"idList" => array:2 [▼
0 => array:1 [▼
"id" => "123456"
]
1 => array:1 [▼
"id" => "777564"
]
]
"uniqueList" => array:2 [
0 => array:1 [
"id" => "123456"
]
1 => array:1 [
"id" => "777564"
]
]
]
How could something like this be achieved?
Thanks
Use the following approach with array_column(available since PHP 5.5), array_merge and array_unique functions:
$arr = [
"someInfo" => [],
"existingIDs" => [
["id" => "123456"]
],
"idList" => [
["id" => "123456"],
["id" => "777564"],
["id" => "777564"]
]
];
$all_ids = array_merge(array_column($arr['existingIDs'], 'id'), array_column($arr['idList'], 'id'));
$arr['uniqueList'] = array_unique($all_ids);
print_r($arr);
The output:
Array
(
[someInfo] => Array
(
)
[existingIDs] => Array
(
[0] => Array
(
[id] => 123456
)
)
[idList] => Array
(
[0] => Array
(
[id] => 123456
)
[1] => Array
(
[id] => 777564
)
[2] => Array
(
[id] => 777564
)
)
[uniqueList] => Array
(
[0] => 123456
[2] => 777564
)
)

Categories