【问题标题】:how to merge multidimensional arrays whilst preserving all unique key/values?如何在保留所有唯一键/值的同时合并多维数组?
【发布时间】:2011-05-11 23:57:25
【问题描述】:

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

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

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

放入数组,其中 nothing 将被覆盖或省略。我想在“第二个数组”中只有唯一值。这意味着数组school1 将只包含字符串string1 一次

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

如果我可以让第二个数组 = string1, string2 .... 排序 desc

【问题讨论】:

  • 不保留$list2['school1'],只保留$list1['school1']
  • 好吧 :-) 我更改了主题以使其更清晰....在我看来 'school1' == 'school1' 这在问题中有详细解释。
  • 为什么string3 不在第二个数组中?就像标准的 array_merge 函数一样,它不会专门用于“多维合并”。
  • @deceze:我错过了那个。谢谢

标签: php multidimensional-array


【解决方案1】:

我的解决方案

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

    这个函数可能应该写成它与引用一起工作,而不是像这样的值,这将大大提高大数组的性能,但这个对较小的数组也很好。

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      相关资源
      最近更新 更多