如何在保留所有唯一键/值的同时合并多维数组?

时间:2011-05-11 23:57:26

标签: php multidimensional-array

是否有构建php函数或我必须编写自己的一个来合并两个多维数组,如

$list1 = array("school1" => array('string1','string2'));

$list2 = array("school1" => array('string1','string3'),
               "school2" => array('string1','string4','string5')
         );

进入数组,其中将被覆盖或省略。我想在'第二个数组'中只有唯一的值。意味着数组school1仅包含字符串string1

Array ( [school1] => Array ( [0] => string3 [1] => string2 [2] => string1 ) 
        [school2] => Array ( [0] => string5 [1] => string4 [2] => string1 ) ) 

理想的是,如果我可以拥有第二个数组= string1,string2 .... sorted desc

2 个答案:

答案 0 :(得分:2)

我的解决方案

function merge_db_lists ($list1, $list2) {
  $final_array = array();
  $final_array = go_through_list($list1, $final_array);
  $final_array = go_through_list($list2, $final_array);
  return $final_array;
}   

function go_through_list($list,$output){
  foreach (array_keys($list) as $key){
    if (array_key_exists($key, $output)){
      foreach ($list[$key] as $item ){
        $output[$key][] = $item;
      }  
      arsort($output[$key]);
    }
    else{
      $output[$key] = $list[$key];
    }  
  }
  return $output;
}

答案 1 :(得分:2)

我有类似的需求,因为我需要合并包含配置值的n维数组,所以我最后编写了一个函数,我只是将它扩展了一点以应用于n维数组。

/**
 * Recursively merges $array2 to $array1 while keeping the $array2 values
 * and keys unique.
 *
 * @param array $array1 - destination array
 * @param array $array2 - array containing new values
 * @return array
*/
public function arraysMergeUnique($array1, $array2)
{
    foreach ($array2 as $k => $v)
    {
        if ( is_array($array1) )
        {
            // If the meaning the value is a string, and doesn't already exist, add it
            if ( is_string($v) && ! in_array($v, $array1) )
            {
                $array1[] = $v;
            }
            // If the value's an array, make a recursive call with it
            else if ( is_array($v) )
            {
                if ( isset($array1[$k]) )
                {
                    $array1[$k] = $this->arraysMergeUnique($array1[$k], $v);
                }
                else
                {
                    $array1[$k] = $v;
                }
            }                
        }
        else
        {
            $array1 = array($v);
        }
    }

    return $array1;
}

例如,如果您的列表更深,如果'school1'包含'class1':

$list1 = array(
    'school1' => array(
        'string1',
        'string2',
        'class 1' => array(
            'student 1',
        )
    )
);

$list2 = array(
    'school1' => array(
        'string1',
        'string3',
        'class 1' => array(
            'student 1',
            'student 2',
        ),
        'class 2' => array(
            'student 3',
        ),
    ),
    'school2' => array(
        'string1', 
        'string4',
        'string5'
    )
);

生成的数组将完全合并:

$result = array(
    'school1' => array(
        'string1',
        'string2',
        'class 1' => array(
            'student 1',
            'student 2'
        ),
        'string3',
        'class 2' => array(
            'student 3'
        )
    ),
    'school2' => array(
        'string1',
        'string4',
        'string5'
    )
);

该函数可能应该被编写,以便它可以使用引用,而不是像这样的值,这将大大提高大数组的性能,但是这个适用于较小的数组。