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


how to merge multidimensional arrays whilst preserving all unique key/values?

构建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 ) ) 

理想的情况是,如果我能有第二个数组 = 字符串 1, 字符串 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;
}

我也有类似的需求,因为我需要合并包含配置值的 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'
    )
);

该函数可能应该编写为使其与引用一起使用,而不是像这样的值,这将大大提高大数组的性能,但这个函数适用于较小的数组。