Слияние двух массивов, перезапись первого массива вторым - PullRequest
3 голосов
/ 14 марта 2012

Я хотел бы объединить два массива, содержащих список файлов и их ревизию в скобках.

Например:

Массив кулаков:

0 => A[1], 1 => B[2], 2 => C[2], 3 => D[2]

Второй,

0 => B[3], 1 => C[4], 2 => E[4], 3 => F[2], 4 => G[2]

Как я уже сказал, я мог бы объединить оба массива, но перезаписать первый массив данными, присутствующими во втором.

Я использовал это регулярное выражение только для захвата имен файлов (удаление номера ревизии). Я не знаю, прав ли я в этом вопросе):

/\[[^\)]+\]/

Результат, который я ищу, будет следующим:

0 => A[1], 1 => B[3], 2 => C[4], 3 => D[2], 4 => E[4], 5 => F[2], 6 => G[2]

Кроме того, я собирался забыть, все дело в PHP.

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

что-то вроде:

function helper() {
  $result = array();

  foreach (func_get_args() as $fileList) {
    foreach ($fileList as $fileName) {
      list($file, $revision) = explode('[', $fileName, 2);
      $revision = trim($revision, ']');
      $result[$file] = !isset($result[$file]) ? $revision : max($result[$file], $revision);
    }
  }

  foreach ($result as $file => $revision) {
    $result[$file] = sprintf('%s[%s]', $file, $revision);
  }

  return array_values($result);
}

$a = array('A[1]', 'B[2]', 'C[2]', 'D[2]');
$b = array('B[3]', 'C[4]', 'E[4]', 'F[2]', 'G[2]');

print_r(helper($a, $b));

демо: http://codepad.org/wUMMjGXC

2 голосов
/ 14 марта 2012

Один из способов - сопоставить оба массива с

filename => filename[revision]

, чтобы

Array
(
    [0] => A[1]
    [1] => B[2]
    [2] => C[2]
    [3] => D[2]
)

становилось

Array
(
    [A] => A[1]
    [B] => B[2]
    [C] => C[2]
    [D] => D[2]
)

, а затем использовать array_merge (чтопереопределяет записи одним и тем же ключом).

Что-то вроде:

function map($array) {
    $filenames = array_map(function($value) {
        return strstr($value, '[', false);
    }, $array);
    return array_combine($filenames, $array);
}

$result = array_merge(map($array1), map($array2));

Если вы хотите иметь числовые индексы, вы можете вызвать array_values для результата.Код выше требует PHP 5.3, но должно быть легко сделать его совместимым с более ранними версиями.Другое предостережение заключается в том, что он будет работать, только если имена файлов уникальны в массиве.

DEMO (версия PHP 5.2)

Ссылка: array_map, strstr, array_combine, array_merge

1 голос
/ 14 марта 2012

Вы можете использовать оператор объединения :

$newArray = $arr1 + $arr2;

Вы правы, array_merge будет работать, только если ваши ключи были строками.С помощью цифровых клавиш второй массив будет просто добавлен к первому без перезаписи дублирующих ключей.

...