user1140176
user1140176

Reputation: 115

Merge array by index/key keeping all values

I have n number of arrays

$array1=array('usa'=>123, 'uk' => '1234', 'germany'=> '1235');
$array2=array('usa'=>123a, 'uk' => '1234', 'germany'=> '1235aa');
$array3=array('usa'=>123, 'uk' => '1234a', 'germany'=> '123a5');

$arrayn=array('usa'=>123b, 'uk' => '1234', 'germany'=> '1235');

I need a php code so that I can have result as follows:

$final_array=array(
                 'usa'=>'123,123a,123,...,123b',
                 'uk'=>'1234,1234,1234a,...,1234', 
                 'germany'=>'1235,1235aa, 123a5,...,1235'
             );

Can anyone help me how to do this?

Upvotes: 2

Views: 218

Answers (5)

Nanhe Kumar
Nanhe Kumar

Reputation: 16297

function array_merge_multiple() {
    $result = array();
    $numargs = func_num_args();
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        $array = $arg_list[$i];
        $keys = array_keys($array);
        foreach ($keys as $v) {
            if (isset($result[$v])) {
                $result[$v].="," . $array[$v];
            } else {
                $result[$v] = $array[$v];
            }
        }
    }
    return $result;
}
$result=array_merge_multiple($array1,$array2,$array3,$arrayn);

//$result=array_merge_multiple($array1,$array2,$array3,.........,$arrayn);

print_r($result);

Upvotes: 1

Ravi Dhoriya ツ
Ravi Dhoriya ツ

Reputation: 4414

You can create a function, where you can pass your arrays one by one.

<?php
$array1=array('usa'=>'123', 'uk' => '1234', 'germany'=> '1235');
$array2=array('usa'=>'123a', 'uk' => '1234', 'germany'=> '1235aa');
$array3=array('usa'=>'123', 'uk' => '1234a', 'germany'=> '123a5');

function add_arr($arr, &$final)
{
    foreach($arr as $key=>$val){
        if(isset($final[$key])){
            $final[$key].=",".$val;
        }else{
           $final[$key]=$val;
        }
    }
}

$arr_final=array();
add_arr($array1,$arr_final);
add_arr($array2,$arr_final);
add_arr($array3,$arr_final);

print_r($arr_final);
?>

Here is DEMO

Upvotes: 1

Hamster
Hamster

Reputation: 680

You can do something like this:

$array1=array('usa'=>123, 'uk' => '1234', 'germany'=> '1235');

$array3=array('usa'=>1231, 'uk' => '1234a', 'germany'=> '123a5');

$result = array_merge_recursive($array1, $array3);

$result being the merged results

Upvotes: 0

Klemen Tusar
Klemen Tusar

Reputation: 9689

Something like this perhaps

function black_magic($arrays = array()) {
$return = array();
foreach ($arrays as $array) {
    if (!$return) {
    $return = $array;
    continue;
    }

    foreach ($array as $key => $value) {
    if (isset($return[$key])) {
        $return[$key] .= ($return[$key]) ? ",$value" : $value;
    }
    else {
        $return[$key] = $value;
    }

    unset($key, $value);
    }

    unset($array);
}

return $return;
}

Upvotes: 0

Alma Do
Alma Do

Reputation: 37365

So use call_user_func_array() to do this:

$array1=array('usa'=>'123', 'uk' => '1234', 'germany'=> '1235');
$array2=array('usa'=>'123a', 'uk' => '1234', 'germany'=> '1235aa');
$array3=array('usa'=>'123', 'uk' => '1234a', 'germany'=> '123a5');

$result = array_map(function($x)
{
   return join(',', $x);
}, call_user_func_array('array_merge_recursive', [$array1, $array2, $array3]));

That is: array_merge_recursive() will gather all the items with corresponding key. Later array_map() will use join() to transform items to delimiter-separated strings.

Note, that, since all your arrays are separated variables, you'll have to re-count all of them in parameters array for call_user_func_array()

Upvotes: 2

Related Questions