Replace array by specific element value - php

I need to replace my main array elements by 'employee_id'.
I already tried array_replace_recursive() function But It replaces arrays by the default index value.
$merged = array_replace_recursive($empList, $getworkedHrs,
$getErrAttnds);
The arrays look like this:
$empList
array (
0 =>
array (
'employee_id' => '254',
'emp_name' => 'Mary McDonald',
'worked_days' => 0,
'worked_hours' => 0,
'error_attendance' => 0,
),
1 =>
array (
'employee_id' => '255',
'emp_name' => 'Anthony Coffman',
'worked_days' => 0,
'worked_hours' => 0,
'error_attendance' => 0,
),
2 =>
array (
'employee_id' => '316',
'emp_name' => 'cheth aruno',
'worked_days' => 0,
'worked_hours' => 0,
'error_attendance' => 0,
),
)
2nd Array: $getworkedHrs
array (
0 =>
array (
'employee_id' => '254',
'worked_days' => '22',
'worked_hours' => '7.0',
),
1 =>
array (
'employee_id' => '255',
'worked_days' => '8',
'worked_hours' => '7.0',
),
)
3rd array : $getErrAttnds
array (
0 =>
array (
'employee_id' => '316',
'error_attendance' => '1',
),
)
Expected Result Array:
array (
0 =>
array (
'employee_id' => '254',
'emp_name' => 'Mary McDonald',
'worked_days' => 22,
'worked_hours' => 7.0,
'error_attendance' => 0,
),
1 =>
array (
'employee_id' => '255',
'emp_name' => 'Anthony Coffman',
'worked_days' => 8,
'worked_hours' => 7.0,
'error_attendance' => 0,
),
2 =>
array (
'employee_id' => '316',
'emp_name' => 'cheth aruno',
'worked_days' => 0,
'worked_hours' => 0,
'error_attendance' => 1,
),
)

I believe the simplest solution is to merge them in two foreach.
First make the main array associative so that it's easier to get the correct employee.
Then loop the arrays and copy the values.
$empList = array_column($empList, null, 'employee_id');
foreach($getworkedHrs as $entry){
$empList[$entry['employee_id']]['worked_days'] = $entry['worked_days'];
$empList[$entry['employee_id']]['worked_hours'] = $entry['worked_hours'];
}
foreach($getErrAttnds as $entry){
$empList[$entry['employee_id']]['error_attendance'] = $entry['error_attendance'];
}
var_export($empList);
https://3v4l.org/gIXP6

Related

Overwrite rows in one array using another array when two columns are shared between the arrays

I got 2 arrays. In first one field number is empty:
array (
3 => array ( 0 => array ( 'id' => 1, 'number' => 0, 'time' => 40,), ),
4 => array ( 0 => array ( 'id' => 2, 'number' => 0, 'time' => 40, ), ),
5 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 40, ), ),
6 => array ( 0 => array ( 'id' => 1, 'number' => 0, 'time' => 41, ), ),
7 => array ( 0 => array ( 'id' => 2, 'number' => 0, 'time' => 41, ), ),
8 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 41, ), ),
)
In the second one fields number are not empty, however the array is bit different, because it doesn't have a 2 arrays in the middle (id = 3, time = 40 and id = 3, time = 41).
array ( 3 => array ( 'id' => '1', 'number' => '3785', 'time' => '40', ),
4 => array ( 'id' => '2', 'number' => '1574', 'time' => '40', ),
5 => array ( 'id' => '1', 'number' => '2954', 'time' => '41', ),
6 => array ( 'id' => '2', 'number' => '2463', 'time' => '41', ),
)
What I want to do is to some sort of merge of this arrays into one looking like this:
array (
3 => array ( 'id' => '1', 'number' => '3785', 'time' => '40', ),
4 => array ( 'id' => '2', 'number' => '1574', 'time' => '40', ),
5 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 40, ), ),
6 => array ( 'id' => '1', 'number' => '2954', 'time' => '41', ),
7 => array ( 'id' => '2', 'number' => '2463', 'time' => '41', ),
8 => array ( 0 => array ( 'id' => 3, 'number' => 0, 'time' => 41,), ),
)
I tried some variations of array_merge() and array_combine(), but neither of them seems to work, or perhaps I've been using them badly.
Again, notice how row 5 and 8 are not affected because (id = 3 and time = 40) and (id = 3 and time = 41), respectively, are not represented in the second array.
What I tried and it works, but it doesn't look well in my opinion:
foreach($arr2 as $wpis2){
foreach($arr as $key=>$wpis){
if($wpis2['id'] == $wpis[0]['id'] && $wpis2['time'] == $wpis[0]['time']){
$arr[$key] = $wpis2;
}
}
}
You will need to iterate over the first array in order to populate a key-map based on the combination of id and time values from all rows.
Use a second loop to iterate over the second array and access the correct key to overwrite by leveraging the mapping array.
Code: (Demo)
$map = [];
foreach ($first as $k => [['id' => $id, 'time' => $time]]) {
$map["{$id}_{$time}"] = $k;
}
foreach ($second as $row) {
$key = $map["{$row['id']}_{$row['time']}"];
$first[$key] = $row;
}
var_export($first);

Finding duplicate values in a multidimensional array for Search Method

My Code was :
$data = array();
foreach ($table as $key => $var) {
$data[] = ['id' => $var->id, 'value' => $var->designation];
}
My Data array should be like this
array (
0 => array (
'id' => 27,
'value' => 'laravel',
),
1 => array (
'id' => 1,
'value' => 'laravel tester',
),
2 => array (
'id' => 22,
'value' => 'laravel developer',
),
3 => array (
'id' => 23,
'value' => 'laravel casts',
),
4 => array (
'id' => 24,
'value' => 'laravel developer',
),
)
I need only one value i tried all the php core library function output:
array (
0 =>
array (
'id' => 27,
'value' => 'laravel',
),
1 => array (
'id' => 1,
'value' => 'laravel tester',
),
2 => array (
'id' => 23,
'value' => 'laravel casts',
),
3 => array (
'id' => 24,
'value' => 'laravel developer',
),
)
Based on the name only i need to remove duplicate bacause in my search bar it shows repeated mode.
You can use array_unique, wich saves indexes, and get the result by array_intersect_key
$temp = array_unique(array_column($arr, 'value'));
$res = array_intersect_key($arr, $temp);
print_r($res);

Mongodb Search from Collection

I need to Search collection in mongodb having
'food_name' => 'fish'
and
'room_features' =>
array (
0 => 'Shower',
1 => 'Hairdryer',
),
I tried the following code. But the result is not-correct. I think multiple $eq is not allowed (same index in array).
array (
'$and' =>
array (
array (
'food' =>
array (
'$elemMatch' =>
array (
'food_name' =>
array (
'$eq' => 'fish',
),
),
),
),
array (
'room' =>
array (
'$elemMatch' =>
array (
'room_features' =>
array (
'$elemMatch' =>
array (
'$eq' => 'Shower'
'$eq' => 'Hairdryer'
),
),
'roomrate' =>
array (
'$eq' => new MongoInt32(2500),
),
),
),
),
),
)
Here is the document I need to search.
array (
'_id' => new MongoId("59670aca7fafd8342e3c9869"),
'subcat_name' => 'Test',
'place' => '',
'description' => '',
'created_date' => '1499970060',
'created_by' => 'Admin',
'openingtime' => '',
'closingtime' => '',
'hotel_class_id' => '594245f67fafd87e243c986a',
'hotel_type_id' => '594244177fafd884563c9869',
'latitude' => '0',
'longitude' => '0',
'dist_id' => '5911966a7fafd8c83c3c986a',
'cat_id' => '58fb230e7fafd883183c986d',
'featured' => '0',
'visited' => new MongoInt64(5),
'subcat_slug' => 'test-trivandrum-1',
'image' => NULL,
'food' =>
array (
0 =>
array (
'food_id' => '149992634012642164',
'region_id' => '5944ba947fafd883333c9869',
'food_name' => 'fish',
'type' => 'veg',
'rate' => '100',
),
1 =>
array (
'food_id' => '14999366891994980639',
'region_id' => '595c75c17fafd835173c986c',
'food_name' => 'curry',
'type' => 'veg',
'rate' => '1000',
),
),
'room' =>
array (
0 =>
array (
'room_id' => '14999346791721342880',
'roomtype' => 'DELUXE KING ROOM1',
'roomrate' => new MongoInt64(2500),
'image' => 'beach_icon33.png',
'room_features' =>
array (
0 => 'Shower',
1 => 'Hairdryer',
),
),
1 =>
array (
'room_id' => '14999346901389554873',
'roomtype' => 'DELUXE KING ROOM new',
'roomrate' => new MongoInt64(4000),
'image' => 'beach_icon34.png',
'room_features' =>
array (
0 => 'Shower',
1 => 'Bathrobe',
),
),
),
)
Please Give me an alternate way to search multiple item from array.
Thanks in advance.
I think if you want to query list you can add the list in query,
try this
{
"food" : {
"$elemMatch": {
"food_name" : "fish"
}
},
"room" : {
"$elemMatch": {
"room_features" : ["Shower", "Hairdryer"]
}
},
}
Hope this help.

Trouble getting object from parsed JSON output

I'm playing around with the twitter API and i'm trying to parse the json output. However somehow i'm doing something wrong and I'm not getting what I would like to get.
In this case i'm writing in PHP. Started looping thru the array and screen_name and text are working accordingly.
foreach ($statuses as $obj) {
$screen_name = filter_var($obj->user->screen_name, FILTER_SANITIZE_STRING);
$text = filter_var($obj->text, FILTER_SANITIZE_STRING);
$urls = filter_var($obj->entities->urls->url, FILTER_SANITIZE_URL);
}
the JSON array output:
array (
0 =>
stdClass::__set_state(array(
'created_at' => 'Fri Oct 07 15:31:01 +0000 2016',
'text' => 'test',
'entities' =>
stdClass::__set_state(array(
'hashtags' =>
array (
0 =>
stdClass::__set_state(array(
'text' => '30Under30',
'indices' =>
array (
0 => 36,
1 => 46,
),
)),
),
'symbols' =>
array (
),
'user_mentions' =>
array (
),
'urls' =>
array (
0 =>
stdClass::__set_state(array(
'url' => 'https://Forbes.com',
'expanded_url' => 'https://twitter.com/i/web/status/784415744427687936',
'display_url' => 'twitter.com/i/web/status/7…',
'indices' =>
array (
0 => 117,
1 => 140,
),
)),
),
)),
'source' => 'Sprinklr',
'in_reply_to_screen_name' => NULL,
'user' =>
stdClass::__set_state(array(
'id' => 91478624,
'screen_name' => 'test',
'url' => 'http://Forbes.com',
'entities' =>
stdClass::__set_state(array(
'url' =>
stdClass::__set_state(array(
'urls' =>
array (
0 =>
stdClass::__set_state(array(
'url' => 'http://Forbes.com',
'expanded_url' => 'http://forbes.com',
'display_url' => 'forbes.com',
'indices' =>
array (
0 => 0,
1 => 22,
),
)),
),
)),
'description' =>
stdClass::__set_state(array(
'urls' =>
array (
0 =>
stdClass::__set_state(array(
'url' => 'http://Forbes.com',
'expanded_url' => 'http://Forbes.com',
'display_url' => 'Forbes.com',
'indices' =>
array (
0 => 28,
1 => 48,
),
)),
),
)),
)),
'protected' => false,
'notifications' => false,
)),
'geo' => NULL,
'lang' => 'en',
)),
)
Since urls is an array, you need to index it.
$urls = filter_var($obj->entities->urls[0]->url, FILTER_SANITIZE_URL);

Using COUNT_RECURSIVE with a specified key name?

count($arr['children'], COUNT_RECURSIVE); to get the total number of keys inside the original children key, however I'm wanting to filter out all but the keys named 'children.' I'm unsure the count_recursive works like this.
$arr = array (
'id' => '81',
'parent' => NULL,
'children' =>
array (
0 =>
array (
'id' => '173',
'parent' => '81',
),
1 =>
array (
'id' => '84',
'parent' => '81',
'children' =>
array (
0 =>
array (
'id' => '85',
'parent' => '84',
'children' =>
array (
0 =>
array (
'id' => '131',
'parent' => '85',
'children' =>
array (
0 =>
array (
'id' => '176',
'parent' => '131',
),
),
),
),
),
1 =>
array (
'id' => '174',
'parent' => '84',
),
2 =>
array (
'id' => '175',
'parent' => '84',
),
),
),
),
);
echo count($arr['children'], COUNT_RECURSIVE);
I'm trying to have it return 7, but because it's counting all keys, it returns 24. How could I do this?

Categories