2012-03-14 1 views
3

Je voudrais fusionner deux tableaux contenant une liste de fichiers plus leur révision entre parenthèses.Fusion de deux tableaux, écrasement du premier tableau avec le second

Par exemple:

tableau Fist

:

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

deuxième,

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

Comme je l'ai dit, je serais en mesure de fusionner les deux tableaux, mais en remplaçant le premier par les données présentes dans le second.

J'ai utilisé cette expression rationnelle pour saisir uniquement les noms de fichiers (suppression du numéro de révision). Je ne sais pas si je ne me trompe pas sur ce point):

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

Le résultat que je cherche ne serait-ce,

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

Aussi, j'allais oublier, la chose est en PHP.

+0

http: // php .net/array_merge – bfavaretto

+1

array_merge ne fonctionnera pas dans mon cas car j'ai besoin d'écraser les données existantes. Aussi, j'ai besoin de traiter les numéros de révisions associés aux fichiers (en une seule grande chaîne). –

Répondre

4

quelque chose comme:

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

demo: http://codepad.org/wUMMjGXC

+0

Le code précédent que vous avez posté fonctionnait parfaitement! J'ai oublié de le mentionner, mais nous utilisent encore PHP4 ici :(Mais merci pour votre réponse, cela fonctionne parfaitement. –

+0

L'a encore modifié (un peu). Je suppose que cela devrait fonctionner aussi en php4. La partie 'func_get_args()' pourrait être problématique. Peut-être que vous devez utiliser une variable supplémentaire au lieu d'utiliser le résultat directement. – Yoshi

+0

Cette version fonctionne parfaitement sous PHP4. Merci beaucoup pour votre aide ! Très appréciée –

0

Vous pouvez utiliser le union operator:

$newArray = $arr1 + $arr2; 

Vous avez raison, array_merge ne fonctionne que si vos clés sont des chaînes. Avec les touches numériques, le second tableau sera simplement ajouté au premier, sans écraser les clés dupliquées.

+0

J'obtiens ce résultat avec l'opérateur union: 0 => A [1], 1 => B [2], 2 => C [2], 3 => D [2], 4 => G [2] :( –

+0

avez-vous essayé l'inversion de l'ordre ('$ arr2 + $ arr1')? Voici comment cela fonctionne:" L'opérateur + retourne le tableau de droite ajouté au tableau de gauche, pour les clés qui existent à la fois tableaux, les éléments du tableau de gauche seront utilisés et les éléments correspondants du tableau de droite seront ignorés. " – bfavaretto

+0

@bfavaretto: Les touches ne jouent aucun rôle ici. * –

2

Un moyen serait de cartographier les deux tableaux à

filename => filename[revision] 

tels que

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

devient

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

puis utilisez array_merge (qui remplace les entrées avec la même clé) .

Quelque chose comme:

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

Si vous voulez avoir des index numériques, vous pouvez appeler array_values sur le résultat. Le code ci-dessus nécessite PHP 5.3 mais il devrait être facile de le rendre compatible avec les versions antérieures. L'autre avertissement est que cela ne fonctionnerait que si les noms de fichiers sont uniques dans le tableau.

DEMO (PHP version 5,2)

Référence:array_map, strstr, array_combine, array_merge

+0

Merci beaucoup pour votre réponse, mais j'ai oublié de mentionner que nous utilisons encore PHP4 ici :( –

+0

Ouais j'ai remarqué que: DI va encore laisser la réponse pour d'autres n'utilisant pas PHP 4;) –

Questions connexes