Как объединить многомерные массивы, сохранив все уникальные ключи / значения? - PullRequest
0 голосов
/ 12 мая 2011

есть в функции сборки 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 ]

2 голосов
/ 08 февраля 2013

У меня была похожая потребность, потому что мне нужно было объединить 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'
    )
);

Функция должнавероятно, написано так, чтобы оно работало со ссылками, а не со значениями, подобными этому, что значительно улучшило бы производительность с большими массивами, но это прекрасно работает с меньшими.

2 голосов
/ 16 мая 2011

мое решение

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...