views:

121

answers:

4

Example:

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4");
$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5");

Output:

$result = array('a' => array( 'f1' => "1", 'f2' => "9"),
              'b' => array( 'f1' => "2", 'f2' => "8"),
              'c' => array( 'f1' => "3", 'f2' => "7"),
              'd' => array( 'f1' => "0", 'f2' => "6"),
              'e' => array( 'f1' => "0", 'f2' => "5"),
              'z' => array( 'f1' => "4", 'f2' => "0"),);

the size of $arr1 can be '>', '<' or '=' size of $arr2

+1  A: 

array_merge_recursive() should work: http://php.net/manual/en/function.array-merge-recursive.php

otherwise it's simple enough wo implement in a few lines: (Unless you really need the "fn" indices.)

function my_merge(){

    $result = array();
    foreach(func_get_args() as $a)
        foreach($a as $index => $value)
            $result[$index][] = $value;         

}
geon
Relax your requirements for the data format, and you can simplify the code by several orders of magnitude. Unless it *really, really* must have exactly the format in your example, it's a reasonable tradeoff.
geon
A: 

Try this:

$keys = array_unique(array_merge(array_keys($arr1), array_keys($arr2)));
$values = array_map(function($key) use ($arr1, $arr2) {
    return array('f1' => isset($arr1[$key]) ? $arr1[$key] : "0",
                 'f2' => isset($arr2[$key]) ? $arr2[$key] : "0"); }
    , $keys);
$result = array_combine($keys, $values);
var_dump($result);

Some explanation:

  • At first get an array $keys of all unique keys of both arrays.
  • Then for each key the corresponding array of values is then generated.
  • At last the array of keys and the array of values are combined.

But this does currently only work with two arrays.


Edit    Here’s one that works with an arbitrary number of arrays:

$arrays = array($arr1, $arr2);
$keys = array_unique(call_user_func_array('array_merge', array_map('array_keys', $arrays)));
$values = array_map(function($key) use ($arrays) {
    return array_combine(array_map(function($key) {
        return 'f'.($key+1);
    }, array_keys($arrays)),
    array_map(function($array) use ($key) {
        return isset($array[$key]) ? $array[$key] : "0";
    }, $arrays));
}, $keys);
$result = array_combine($keys, $values);
var_dump($result);

Some explanation:

  • Put all arrays in an array $arrays.
  • For each array in $arrays, call array_keys on it to get the keys, merge these arrays and get an array $keys of all unique keys.
  • For each key in $keys, check if the key exists in the array of arrays $arrays.
  • Combine the keys and values.
Gumbo
@D3VELOPER: Can you elaborate on that? It works fine for me.
Gumbo
A: 
$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4");

$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5");

function combineArray($arr1, $arr2) {
    if (is_array($arr1) && is_array($arr2)) {
        $rArr = array();
        $steps = max ( count($arr1),count($arr2));
     $ak1 = array_keys($arr1);
     $ak2 = array_keys($arr2);

        for ($i=0;$i<$steps;$i++) {
                if (!isset($rArr[$i])) $rArr[$i]=array();
                $rArr[$i]['f1'] = (isset($arr1[$ak1[$i]])) ? $arr1[$ak1[$i]]: '0';
                $rArr[$i]['f2'] = (isset($arr2[$ak2[$i]])) ? $arr2[$ak2[$i]]: '0';
        }
        return $rArr;

    }else {
        return false;
    }
}

echo "<pre>".print_r (combineArray($arr1, $arr2),true);

might work :)

someGuy
AH... forget about that -.- :D
someGuy
A: 

I think this it,

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4");

$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5");


foreach($arr1 as $key => $value){
    $a[$key]['f1'] = $value;
}

foreach($arr2 as $key => $value){
    $b[$key]['f2'] = $value;
}

$c = array_merge_recursive($a, $b);
foreach($c as $key => $value){
    $result[$key]['f1'] = (array_key_exists('f1', $value)) ? $value['f1']: 0;
    $result[$key]['f2'] = (array_key_exists('f2', $value)) ? $value['f2']: 0;
}

echo "<pre>".print_r ($result, true);

the output:

Array
(
    [a] => Array
        (
            [f1] => 1
            [f2] => 9
        )

    [b] => Array
        (
            [f1] => 2
            [f2] => 8
        )

    [c] => Array
        (
            [f1] => 3
            [f2] => 7
        )

    [z] => Array
        (
            [f1] => 4
            [f2] => 0
        )

    [d] => Array
        (
            [f1] => 0
            [f2] => 6
        )

    [e] => Array
        (
            [f1] => 0
            [f2] => 5
        )

)
D3VELOPER