2011-05-11 42 views
0

是有在建PHP函数或我必须写我自己的一个合并这样的如何合并多维数组,同时保留所有唯一键/值?

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

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

2个多维数组到数组,其中什么覆盖或省略。我想在'第二个数组'中只有唯一的值。这意味着数组school1将包含字符串string1一次性

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

理想的情况是,如果我能有第二阵列=字符串1,字符串....排序倒序

+0

这并不保留'$ list2 ['school1']',只有'$ list1 ['school1']'。 – BoltClock 2011-05-11 23:58:38

+0

好:-)我改变了话题,使其更清楚....在我的眼睛'学校1'=='学校1'这是在问题中详细解释。 – Radek 2011-05-12 00:01:43

+1

为什么不在第二个数组中的'string3'?正如标准的'array_merge'函数可以做到这一点,而且没有什么特别的“多维合并”。 – deceze 2011-05-12 00:07:53

回答

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; 
} 
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' 
    ) 
); 

功能应该写成可以与引用一起工作,而不是像这样的值,这会大大提高大数组的性能,但是对于较小的数组,这种方法可以很好地工作。

相关问题