2012-03-14 4 views
3

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

Например:

Кулак массив:

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.

+0

HTTP: // PHP ,net/array_merge – bfavaretto

+1

array_merge не будет работать в моем случае, потому что мне нужно перезаписать существующие данные. Кроме того, мне нужно иметь дело с номерами ревизий, связанными с файлами (в одной большой строке). –

ответ

4

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

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

+0

Предыдущий код, который вы опубликовали, работает безупречно! Я забыл упомянуть, но мы все еще используют PHP4 здесь :(Но спасибо за ваш ответ, он работает отлично. –

+0

Изменено это снова (немного). Я думаю, он должен работать и в php4. Часть 'func_get_args()' может быть проблематичной. Возможно, вам придется использовать дополнительную переменную вместо прямого результата. – Yoshi

+0

Эта версия отлично работает под PHP4. Большое спасибо за Вашу помощь ! Очень благодарен –

0

Вы можете использовать union operator:

$newArray = $arr1 + $arr2; 

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

+0

Я получаю этот результат с оператором объединения: 0 => A [1], 1 => B [2], 2 => C [2], 3 => D [2], 4 => G [2] :( –

+0

Вы пытались инвертировать порядок ('$ arr2 + $ arr1')? Вот как это работает:« Оператор + возвращает правый массив, присоединенный к левому массиву, для ключей, которые существуют в обоих массивы, элементы из левого массива будут использоваться, а соответствующие элементы из правого массива будут проигнорированы ». – bfavaretto

+0

@bfavaretto: ключи здесь не играют никакой роли. Это о значении ** * * Записи. Эта проблема не имеет простого решения. –

2

Один из способов будет отображать как массивы

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

+0

Большое спасибо за ваш ответ, но я забыл упомянуть, что мы все еще используем PHP4 здесь :( –

+0

Да, я заметил, что: DI все равно оставит ответ за другие не используют PHP 4;) –