Как объединить 2 ассоциативных массива в PHP? - PullRequest
0 голосов
/ 22 сентября 2010

Пример:

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

Выход:

$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"),);

размер $ arr1 может быть '>', '<' или '=' размер $ arr2 </p>

Ответы [ 4 ]

3 голосов
/ 22 сентября 2010

Я думаю, что это,

$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);

вывод:

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
        )

)
1 голос
/ 22 сентября 2010

array_merge_recursive () должно работать: http://php.net/manual/en/function.array-merge-recursive.php

в противном случае достаточно просто реализовать несколько строк: (Если вам действительно не нужны индексы "fn".)

function my_merge(){

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

}
0 голосов
/ 22 сентября 2010
$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);

может работать:)

0 голосов
/ 22 сентября 2010

Попробуйте это:

$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);

Некоторые объяснения:

  • Сначала получите массив $keys всех уникальных ключей обоих массивов.
  • Затем для каждого ключа генерируется соответствующий массив значений.
  • Наконец массив ключей и массив значений объединены.

Но в настоящее время это работает только с двумя массивами.


Редактировать Вот тот, который работает с произвольным числом массивов:

$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);

Некоторое объяснение:

  • Поместить все массивы в массив $arrays.
  • Для каждого массива в $arrays, вызовите array_keys для получения ключей, объедините эти массивы и получите массив $keys всех уникальных ключей.
  • Для каждого ключа в $keys проверьте, существует ли ключ в массиве массивов $arrays.
  • Объедините ключи и значения.
...