2012-03-14 26 views
3

ファイルのリストとそのリビジョンを含む2つの配列を括弧でマージしたいと思います。例えば2つの配列をマージして、最初の配列を2番目のものに上書きする

拳配列:

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] 

私が言ったように、私は両方の配列をマージすることができ、しかしによって最初のものを上書きすることになります第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は既存のデータを上書きする必要があるため、私の場合は機能しません。また、ファイルに関連するリビジョン番号(1つの大きな文字列)を処理する必要があります。 –

答えて

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にのみ動作します。テンキーでは、2番目の配列は、重複するキーを上書きすることなく最初の配列に追加されます。

+0

私はこの結果をユニオン演算子で得る:0 => A [1]、1 => B [2]、2 => C [2]、3 => D [2]、4 => G [2] :( –

+0

) '+ arr2 + $ arr1')を逆順にしようとしましたか?これはどのように動作するのですか:" +演算子は、左側の配列に追加された右側の配列を返します。配列の左側の配列の要素が使用され、右側の配列の要素が無視されます。 – bfavaretto

+0

@bfavaretto:ここではキーは何の役割も果たしません。この問題には簡単な解決策はありません –

2

一つの方法は、

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] 
) 

となる

filename => filename[revision] 

ように両方の配列をマッピングした後(同じキーを持つエントリを上書きする)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が必要ですが、以前のバージョンと互換性を持たせるのは簡単です。もう1つの注意点は、ファイル名が配列内で一意である場合にのみ機能するということです。

DEMO(PHP 5.2版)

参考:array_mapstrstrarray_combinearray_merge

+0

あなたの答えは大変ありがとうございますが、ここでもPHP4を使用していることを忘れていました。( –

+0

DIは引き続き答えを残していますPHP 4を使用していない他の人) –

関連する問題