Compare 2 arrays that exist in the same multidimensional array - php

I have an associative array as such:
Array
(
[0] => Array
(
[0] => Array
(
[0] => name=>Jose
[1] => email=>jo#example.com
)
[1] => Array
(
[0] => name=>Adriana
[1] => email=>add#example.com
)
)
[1] => Array
(
[0] => Array
(
[0] => name=>Jose
[1] => email=>juniper#example.com
)
[1] => Array
(
[0] => name=>Maria
[1] => email=>maria#example.com
)
)
)
I want to collect all email addresses of all members. Jose has 2 email addresses, Maria 1, and Adriana 1. How do I compare 2 arrays that co-exist in a multidimensional array?
I want something like:
Array
(
[0] => Array
(
[0] => name=>Jose
[1] => firstemail=>jo#example.com
[2] => secondemail=>juniper#example.com
)
[1] => Array
(
[0] => name=>Adriana
[1] => firstemail=>add#example.com
)
[2] => Array
(
[0] => name=>Maria
[1] => firstemail=>maria#example.com
)
)
thanks in advance!

Like this
$finalarray = array();
foreach ($inputarray as $subarray) {
foreach($subarray as $entry) {
if (!array_key_exists($entry["name"], $finalarray)) {
$finalarray[$entry["name"]] = array();
}
array_push($finalarray[$entry["name"]], $entry["email"]);
}
}

Related

php merge duplicate values in a array

I apologize for not being word-perfect in English.
I have this result from a foreach loop in php.
my file is jason.
Merging more value into one array
Array
(
[777565] => Array
(
[0] => Array
(
[0] => 777565-1
[1] => 777565-2
)
[1] => Array
(
[0] => 777565-3
[1] => 777565-4
)
[2] => Array
(
[0] => 777565-5
[1] => 777565-6
)
)
[777566] => Array
(
[0] => Array
(
[0] => 777566-1
[1] => 777566-2
)
[1] => Array
(
[0] => 777566-3
[1] => 777566-4
)
[2] => Array
(
[0] => 777566-5
[1] => 777566-6
)
)
)
but, I want Something like this:
Array
(
[777565] => Array
(
[0] => 777565-1
[1] => 777565-2
[2] => 777565-3
[3] => 777565-4
[4] => 777565-5
[5] => 777565-6
)
[777566] => Array
(
[0] => 777566-1
[1] => 777566-2
[2] => 777566-3
[3] => 777566-4
[4] => 777566-5
[5] => 777566-6
)
)
I tried hard and searched the internet but I could not find any way.
Of course, I have the ability to move it to the database first and then to the array, but I think there should be a faster way. What do you think?
thanks for reply.
If you have no problem looping through it and flatten the array according to your desire then you can try this:
$parent =
Array
(
[777565] => Array
(
[0] => Array
(
[0] => 777565-1
[1] => 777565-2
)
[1] => Array
(
[0] => 777565-3
[1] => 777565-4
)
[2] => Array
(
[0] => 777565-5
[1] => 777565-6
)
)
[777566] => Array
(
[0] => Array
(
[0] => 777566-1
[1] => 777566-2
)
[1] => Array
(
[0] => 777566-3
[1] => 777566-4
)
[2] => Array
(
[0] => 777566-5
[1] => 777566-6
)
)
);
$length = count($parent);
$result=[];
for($i=0; $i<$length; $i++){
for($j=0; $j<3; $j++){
$l=0;
for($k=0; $k<2; $k++){
$result[777565+$i][$j][$l++] = $parent[777565+$i][$j][$k];
}
}
}

php - Issue with extracting array values

I'm getting all the HTML post values in the $postdata variable.
$postdata = $this->input->post();
unset($postdata['submit']);
unset($postdata['valve_no']);
Output of $postdata:
Array (
[1] => Array (
[0] => BH123
[1] => H89
)
[2] => Array (
[0] => BH123
[1] => H89
)
[3] => Array (
[0] => BH123
[1] => H89
)
[4] => Array (
[0] => BH123
)
)
$valve_no=$this->input->post('valve_no');
Output of $valve_no:
Array (
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
Next is I'm trying to merge both arrays
foreach($postdata as $key => $val)
{
$dataSet[] = array ('valve_no'=>$valve_no[$key-1],$postdata[$key]);
}
print_r($dataSet);
Output of $dataSet:
Array (
[0] => Array (
[valve_no] => 1
[0] => Array (
[0] => BH123
[1] => H89
)
)
[1] => Array (
[valve_no] => 2
[0] => Array (
[0] => BH123
[1] => H89
)
)
[2] => Array (
[valve_no] => 3
[0] => Array (
[0] => BH123
[1] => H89
)
)
[3] => Array (
[valve_no] => 4
[0] => Array (
[0] => BH123
)
)
)
The output I'm expecting is below:
Array (
[0] => Array (
[valve_no] => 1
[1] => BH123
[2] => H89
)
[1] => Array (
[valve_no] => 2
[1] => BH123
[2] => H89
)
[2] => Array (
[valve_no] => 3
[1] => BH123
[2] => H89
)
[3] => Array (
[valve_no] => 4
[1] => BH123
)
)
)
As you can see in the expected output I want to extract the sub-array and need to start with [1] instead of [0].
Thanks in advance.
Just change foreach() code like this: (As per your comment)
foreach($postdata as $key => $val)
{
$dataSet[$key-1]['valve_no'] = $valve_no[$key-1];
foreach($val as $k=>$v){
$dataSet[$key-1][$k+1] =$v;
}
}
print_r($dataSet);
Output: https://3v4l.org/P8NKs
Note: In case $postdata sub-array indexes not start with 0,1,2... and still you want them to start with 1,2,... in your result, then do like below:
foreach($postdata as $key => $val)
{
$dataSet[$key-1]['valve_no'] = $valve_no[$key-1];
$srNo = 1;
foreach($val as $v){
$dataSet[$key-1][$srNo] =$v;
$srNo++;
}
}
Output: https://3v4l.org/sLVv5

Push in array if key exists

I have the following multidimensional array:
Array
(
[0] => Array
(
[name] => Viettel
[data] => Array
(
[0] => 1559881644000,500
)
)
[1] => Array
(
[name] => FPT
[data] => Array
(
[0] => 1559994465000,172
)
)
[2] => Array
(
[name] => MobiFone
[data] => Array
(
[0] => 1559997314000,11164
)
)
[3] => Array
(
[name] => Vietnamobile
[data] => Array
(
[0] => 1559993699000,1246
)
)
[4] => Array
(
[name] => Viettel
[data] => Array
(
[0] => 1560000096000,47886
)
)
[5] => Array
(
[name] => VinaPhone
[data] => Array
(
[0] => 1559997553000,11132
)
)
[6] => Array
(
[name] => VNPT
[data] => Array
(
[0] => 1559993066000,84
)
)
)
I'm currently using a foreach loop to extract the values from the array:
$result = [];
$nameData = [];
foreach($data as $key => $itemData)
{
}
I want array look like this:
Array
(
[0] => Array
(
[name] => Viettel
[data] => Array
(
[0] => 1559881644000,500
[1] => 1560000096000,47886
)
)
[1] => Array
(
[name] => FPT
[data] => Array
(
[0] => 1559994465000,172
)
)
[2] => Array
(
[name] => MobiFone
[data] => Array
(
[0] => 1559997314000,11164
)
)
[3] => Array
(
[name] => Vietnamobile
[data] => Array
(
[0] => 1559993699000,1246
)
)
[4] => Array
(
[name] => VinaPhone
[data] => Array
(
[0] => 1559997553000,11132
)
)
[5] => Array
(
[name] => VNPT
[data] => Array
(
[0] => 1559993066000,84
)
)
)
It seems you are looking for groupby the array by name.
You can use foreach with array_key_exists and array_push
$groupBy = [];
foreach($a as $v){
array_key_exists($v['name'], $groupBy) ?
array_push($groupBy[$v['name']]['data'], $v['data'][0])
:
($groupBy[$v['name']] = $v)
;
}
If you want to rearrange the keys of array, you can use array_values
print_r(array_values($groupBy));
Working DEMO :- https://3v4l.org/ASWDV
You can just loop over the input array, adding values to the output if they don't exist and merging that data values if they do:
$result = array();
foreach ($data as $itemData) {
if (($k = array_search($itemData['name'], array_column($result, 'name'))) !== false) {
$result[$k]['data'] = array_merge($result[$k]['data'], $itemData['data']);
}
else $result[] = $itemData;
}
print_r($result);
Output is as you desire (too long to reproduce here)
Demo on 3v4l.org
If you are adding a single value to the array you can just access to it with something like this:
$result[0]['data'][1] = 1560000096000,47886

how can i break a multidimensional array into keys and values

I really have no clue to achieve the outpu i want. I tried adding these brackets [] next to my key but it made the array more complex
this is how my array look like
Array
(
[0] => Array
(
[0] => Array
(
[white] => 1
[black] => 1
)
)
)
this is what i would like
Array
(
[0] => Array
(
[0] => Array
(
[0] => white
[1] => 1
)
[1] => Array
(
[0] => black
[1] => 1
)
)
)
It's pretty simple:
$arr = [[['white' => 1, 'black' => 1]]];
$items = $arr[0][0];
$arr[0] = [];
foreach ($items as $k => $v) {
$arr[0][] = [$k, $v];
}
print_r($arr);
The output:
Array
(
[0] => Array
(
[0] => Array
(
[0] => white
[1] => 1
)
[1] => Array
(
[0] => black
[1] => 1
)
)
)

How remove duplicate multidimensional array by first dimension

i have a 2-dimensionl array such as this:
Array
(
[0] => Array
(
[0] => talk
[1] => amount
)
[1] => Array
(
[0] => base
[1] => amazing
)
[2] => Array
(
[0] => talk
[1] => filter
)
[3] => Array
(
[0] => label
[1] => any
)
[4] => Array
(
[0] => talk
[1] => amount
)
[5] => Array
(
[0] => tour
[1] => any
)
)
how remove duplicate value by first dimension and result such as this:
Array
(
[0] => Array
(
[0] => talk
[1] => amount
)
[1] => Array
(
[0] => base
[1] => amazing
)
[2] => Array
(
[0] => label
[1] => any
)
[3] => Array
(
[0] => tour
[1] => any
)
)
there is much help about remove duplicate values in the array, but I didn't see any sample about remove duplicates by specific dimension.
<?php
function uniqueArray($array)
{
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
foreach ($result as $key => $value)
{
if ( is_array($value) )
{
$result[$key] = uniqueArray($value);
}
}
return $result;
}
?>
This will helps you
Note: not tested

Categories