2009-09-08 8 views
0

J'ai deux tableaux que je voudrais comparer et finalement terminer avec un seul tableau avec tout combiné, n'ayant pas de doublons. Quelqu'un peut-il me dire quelle fonction je devrais utiliser? Il y en a tellement que c'est un peu déroutant. Array1 est un tableau que j'ai créé et que je veux ajouter à un tableau provenant de la base de données. La clé dans le second tableau est également appelée "nom". Merci.Comment comparer les tableaux et extraire la différence?

EDIT:

j'ai réussi à fusionner ces deux tableaux, mais je peux encore voir les doublons.

C'est ce que le premier tableau ressemble à:

Array 
(
    [0] => Array 
     (
      [WNumber] => ADMIN 
      [Name] => Tim, Cooley 
      [Employer] => CalPERS 
      [Student] => 1 
      [Perm] => 1 
      [QA] => 0 
      [Supervisor] => 1 
      [RQW] => 0 
     ) 

Mon deuxième tableau est construit comme ceci:

$add_names[]['Name']='Jim, Jones'; 

Je veux juste ajouter add_names $ au premier tableau où il n'y a pas doublons.

+0

Ce que vous attendez dans le tableau de résultat? Pourriez-vous me donner un exemple? – inakiabt

+0

Il s'agit donc d'un tableau non imbriqué? –

+0

Bien sûr .. Je l'afficherai ci-dessus –

Répondre

1

Je suis tenté de vous vendre sur CakePHP, car il a un certain nombre de fonctions qui facilite cette opération dans sa catégorie « Set ». Votre problème est que vous avez les résultats dans un tableau imbriqué. Un simple "array_unique" ne fonctionne pas dans un tableau imbriqué.

que je le ferais à l'ancienne ...

$array1[]['name'] = 'Kim, Jones'; 
$array1[]['name'] = 'Jim, Miller'; 

$array2[]['name'] = 'Kim, Jones'; 
$array2[]['name'] = 'Jimbo, Miller'; 
$array2[]['name'] = 'Jim, Jones'; 

$new_array=array_merge($array1, $array2); 
$out_array = array(); 
$key_array = array(); 
foreach($new_array as $i => $row) { 
     if (empty($key_array[$row['name']])) { 
       $out_array[] = $row; 
     } 
     $key_array[$row['name']] = 1; 
} 

print_r($out_array); 

Ce code fonctionne pour moi ...

+0

Salut Dooltaz. Je vais essayer maintenant. Merci beaucoup! Je pensais aussi à l'utilisation d'un foreach avec une comparaison. brb –

+0

Salut Dooltaz. Merci beaucoup Ça a bien marché. Merci encore! –

0

Est-ce que array_diff travail pour vous?

Description 

array array_diff (array $array1 , array $array2 [, array $ ... ]) 
Compares array1 against array2 and returns the difference. 
+0

Salut Preet, merci pour l'aide. Je ne vois pas comment je peux utiliser array_diff parce que j'ai utilisé array_merge sur les deux tableaux et je suis parti avec un seul tableau. Que devrais-je utiliser comme un deuxième tableau pour obtenir le diff? –

1

Je pense que vous aurez besoin d'utiliser une combinaison de array_merge (ajoute les deux tableaux en même temps) et array_unique (supprime les valeurs en double).

$resulting_array = array_unique(array_merge($array1, $array2)); 

Notez que array_unique ne fonctionnera pas correctement lors de l'utilisation des tableaux multidimensionnels, donc si vos données de tableau regarde la façon dont vous le mettez dans votre question, vous devez penser à une façon de contourner cela. One of the comments on the array_unique page suggère serialize 'ing toutes les valeurs de tableau avant de lancer array_unique dessus. Ensuite, vous exécuterez simplement unserialize sur tous les éléments du tableau. Notez que cela peut signifier un impact sur les performances si vous avez un grand tableau, donc vous pouvez envisager d'éviter les tableaux multidimensionnels dans ce scénario.

Quelque chose comme ceci:

$merged_array = array_merge($array1, $array2); 
$serialized_array = array_map("serialize", $merged_array); 
$filtered_array = array_unique($serialized_array); 
$final_array = array_map("unserialize", $filtered_array); 
+0

Merci Aistina mais cela me donne le premier élément dans le tableau et rien d'autre. –

+0

Je viens de rafraichir et maintenant voir le commentaire que vous avez ajouté. J'ai seulement 100 articles dans le tableau. Le premier tableau de ma base de données a plusieurs paires de valeurs de clé, mais je ne suis concerné que par la valeur du nom et j'ai construit le second tableau pour correspondre. –

+0

Merci Aistina. Laissez-moi essayer et je reviens tout de suite et je vous laisse savoir comment ça se passe. –

0

Il n'y a pas une fonction directe pour traiter ce que vous recherchez dans php, probablement vous devez écrire une fonction pour cela.

Ce que je compris de votre question est que vous avez 2 tableaux:

$a = array(array('name' => 'Omid'), 12); 
$b = array(array('name' => 'testing')); 

et que vous voulez les fusionner pour obtenir

$merge = array(array('name' => 'testing'), 12); 

si c'est ce que vous voulez, alors vous voudrez peut-être prendre un coup d'oeil à ce commentaire array merge recursive qui conduit à ce code:

function array_merge_recursive_distinct (array &$array1, array &$array2) 
{ 
    $merged = $array1; 

    foreach ($array2 as $key => &$value) 
    { 
    if (is_array ($value) && isset ($merged [$key]) && is_array ($merged [$key]) ) 
    { 
     $merged [$key] = array_merge_recursive_distinct ($merged [$key], $value); 
    } 
    else 
    { 
     $merged [$key] = $value; 
    } 
    } 

    return $merged; 
} 
+0

Salut les cyniques. Merci pour l'extrait de code. Je vais essayer ça. brb –

Questions connexes