2

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?

Ranjith
  • 2,779
  • 3
  • 22
  • 41
user1140176
  • 115
  • 13

5 Answers5

2

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

Alma Do
  • 37,009
  • 9
  • 76
  • 105
  • What if I have to pass n number of arrays. I mean what if i dont know how many arrays are there?? – user1140176 May 19 '14 at 07:44
  • Then create array, which will contain your arrays. Because if you have some set of variables and you don't know what they are (what are their names, what are their count e t.c.) - then how can you get the result? Your input conditions should be defined, you can not do it with "unknown variables" – Alma Do May 19 '14 at 07:46
1

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

Ravi Dhoriya ツ
  • 4,435
  • 8
  • 37
  • 48
1
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);
Nanhe Kumar
  • 15,498
  • 5
  • 79
  • 71
0

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;
}
Klemen Tusar
  • 9,261
  • 4
  • 31
  • 28
0

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

Hamster
  • 680
  • 7
  • 23