Cross compare two array elements - php

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

Related

PHP combine multi-dimensional arrays

I'm have the following array.
"rent" => array:3 [
0 => array:1 [
0 => "5000"
]
1 => array:3 [
0 => "10000"
1 => "60000"
2 => "80000"
]
2 => []
]
"house_quantity" => array:3 [
0 => array:1 [
0 => "2"
]
1 => array:3 [
0 => "3"
1 => "4"
2 => "6"
]
2 => []
]
"property_id" => array:3 [
0 => 1
1 => 2
2 => 3
]
"type_of_house" => array:3 [
0 => array:1 [
0 => array:1 [
"type" => "studio_apartment"
]
]
1 => array:3 [
0 => array:1 [
"type" => "studio_apartment"
]
1 => array:1 [
"type" => "one_bedroom"
]
2 => array:1 [
"type" => "two_bedroom"
]
]
2 => array:2 [
0 => array:1 [
"type" => "studio_apartment"
]
1 => array:1 [
"type" => "two_bedroom"
]
]
]
]
I want to combine the above array so that it forms an array that looks like this.
"0" => [
"property_id" => 1
"type_of_house" => array:3 [
"type"=> "studio_apartment"
"rent" => "5000"
"house_quantity" => "2"
]
]
"1" => [
"property_id" => 2
"type_of_house" => array:3 [
"type"=> "studio_apartment"
"rent" => "10000"
"house_quantity" => "3"
]
"type_of_house" => array:3 [
"type"=> "one_bedroom"
"rent" => "60000"
"house_quantity" => "4"
]
"type_of_house" => array:3 [
"type"=> "two_bedroom"
"rent" => "80000"
"house_quantity" => "6"
]
]
So far I'm using the foreach loop to loop over the properties and attach the type of houses in each of those properties as follows:
foreach ($request->property_id as $key=> $property_id) {
$result[$key] = array(
'property_id' => $property_id,
'type_of_house' => $request->type_of_house[$key]
);
foreach ($result as $property_key => $property) {
foreach ($property['type_of_house'] as $house_key => $house) {
$house[$key][$house_key] = array(
'rent' => $request->rent[$key][$house_key],
'house_quantity' => $request->house_quantity[$key][$house_key]
);
}
}
$merge = array_merge_recursive($result, $house);
dd($merge);
}
But the array I'm getting back is not quite right. This is the array that I'm getting back.
array:3 [
0 => array:2 [
"property_id" => 1
"type_of_house" => array:1 [
0 => array:1 [
"type" => "studio_apartment"
]
]
]
"type" => "studio_apartment"
1 => array:1 [
0 => array:2 [
"rent" => "5000"
"house_quantity" => "2"
]
]
]
How do I correctly merge such an array, thanks.
Ok, so let's suppose you have 2 arrays
$array1:
Array(2){
[number] => 1,
[address] => "Park Ave 273",
[name] => "Peter Jones"
}
And then a clean $array2, the one i'm gonna be putting my info
To mix them i would have to specify the index i want the first array to get in, for example:
$array1 = array(
"number" => 1,
"address" => "Park Ave 273",
"name" => "Peter Jones"
);
$array2 = array();
$array2['client'] = $array1;
Would return:
Array
(
[client] => Array
(
[number] => 1
[address] => Park Ave 273
[name] => Peter Jones
)
)
In case you have more than one client (on this example) you have to do a foreach loop for every client.

Merging one array into another

I have 2 arrays
Array 1:
array:3 [▼
0 => 1
1 => 2.3
2 => 4.5
]
Array 2:
array:3 [▼
0 => array:2 [▼
"name" => "john"
"age" => 34
]
1 => array:2 [▼
"name" => "doe"
"age" => 12
]
2 => array:2 [▼
"name" => "kelvin"
"age" => 14
]
]
How do I merge array 1 into array 2 so that I have something like this-
array:3 [▼
0 => array:3 [▼
"name" => "john"
"age" => 34,
"score" => 1
]
1 => array:3 [▼
"name" => "doe"
"age" => 12,
"score" => 2.3
]
2 => array:3 [▼
"name" => "kelvin"
"age" => 14,
"score" => 4.5
]
]
Notice that the values of array 1 now have keys called 'score'.
You can use foreach loop with reference &:
$ar = [1,2,3.4];
$ar2 = [['name'=>'Joe','age' => 33],['name'=>'Joe2','age' => 33],['name'=>'Joe3','age' => 33]];
foreach($ar2 as $ind=>&$person){
$person['score'] = $ar[$ind];
}
print_r($ar2);
Demo
Output:
Array
(
[0] => Array
(
[name] => Joe
[age] => 33
[score] => 1
)
[1] => Array
(
[name] => Joe2
[age] => 33
[score] => 2
)
[2] => Array
(
[name] => Joe3
[age] => 33
[score] => 3.4
)
)
You can also use array_walk to walk through the array.
<?php
$a = [1,2.3,4.5];
$b = [
["name" => "john", "age" => 34],
["name" => "doe","age" => 12],
["name" => "kelvin", "age" => 14]
];
array_walk($a,function($val,$key) use (&$b){
$b[$key]['score'] = $val;
});
print_r($b);
Demo: https://3v4l.org/58rXG

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

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',
),
)

array_merge_recursive on multidimensional array

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.

Categories