12
votes

Array_Merge & Array_unique

Y a-t-il une fonction de tableau dans PHP que Array_Merge, comparant les valeurs forte> ignorant les touches? Je pense que array_unique (array_merge ($ a, $ b)) code> fonctionne, mais je pense qu'il doit y avoir une meilleure façon de le faire.

EG. P>

$ab = array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4);


2 commentaires

Je ne pense pas qu'il y ait un moyen plus agréable de le faire. Array_unique (Array_Merge ($ A, $ B)) est en fait une solution assez élégante.


Il est bon de noter que cela ne fonctionnera que si les clés sont numériques ou garanties d'être uniques entre les deux tableaux, sinon array_merge écrasera.


5 Réponses :


-1
votes

Array_merge ignorera les touches numériques, donc dans votre exemple array_merge ($ a, $ b) code> vous donnerait $ ab code>, il n'est pas nécessaire d'appeler array_unique () code>.

Si vous avez des touches de chaîne (c.-à-d. Un tableau associatif) Utilisez array_values ​​() code> premier: p>

array_merge(array_values($a), array_values($b));


5 commentaires

Il veut que les valeurs uniques cependant, il a donc besoin d'appeler array_unique


Où dit-il exactement qu'il ne veut que des valeurs uniques seulement? Juste parce qu'il utilisait array_unique ne signifie rien - il a été librement admis qu'il n'était pas sûr de quoi utiliser et que la description ne fait aucune mention de vouloir uniquement des entrées uniques.


@Will, vous avez raison, les valeurs doivent être uniques @stephen: Désolé, cela aurait pu être déroutant. La solution est: Array_Merge (Array_unique (Array_Merge ($ A, $ B))); Parce que le second array_merge trie la clé de 0 à 4! Merci a tous!


Dans ce cas, vous n'avez pas besoin de deux appels de code array_merge - un array_values ​​ Appel est probablement un meilleur choix


L'exemple de la question initiale montre qu'il recherche les valeurs uniques. Appeling Array_Values ​​() Avant d'appeler Array_Merge () ne fait rien du tout parce que Array_Merge () renumérotera les touches de tableau car les tableaux d'entrée ont des touches numériques (voir les documents PHP Array_Merge () PHP).



-1
votes
$a = array(0 => 0, 1 => 1, 2 => 2);
$b = array(0 => 2, 1 => 3, 2 => 4);

//add any from b to a that do not exist in a
foreach($b as $item){


    if(!in_array($item,$b)){
        $a[] = $item
    }

}

//sort the array
sort($a);

0 commentaires

2
votes
function umerge($arrays){
 $result = array();
 foreach($arrays as $array){
  $array = (array) $array;
  foreach($array as $value){
   if(array_search($value,$result)===false)$result[]=$value;
  }
 }
 return $result;
}

4 commentaires

Je choisirai ceci sur la bonne réponse, car c'est une bonne façon de le faire. Cependant, vous avez écrit "REULT" au lieu de résultat en ligne 5. Autrement: Array_Merge (Array_unique (Array_Merge ($ A, $ B))); Merci a tous.


@Doublejosh Ceci sera plus efficace jusqu'à ce que les tableaux deviennent sensiblement gros, ~ 400 éléments.


@Doublejosh a dû faire face à 10 000 matrices d'éléments et de scripts de 9h50 à une heure d'exécution maximale de 10h00. Eh bien, c'était en 2011 et je suis heureux de ne plus avoir à traiter de ce type de problèmes (nouveaux serveurs d'emploi / de meilleurs serveurs).


OMG. C'est beaucoup de données à gérer directement dans PHP!



1
votes

Pour répondre à la question de la question, pour une solution générale qui fonctionne également avec des tableaux associatifs tout en préservant les clés, je pense que vous trouverez cette solution la plus satisfaisante:

/**
 * array_merge_unique - return an array of unique values,
 * composed of merging one or more argument array(s).
 *
 * As with array_merge, later keys overwrite earlier keys.
 * Unlike array_merge, however, this rule applies equally to
 * numeric keys, but does not necessarily preserve the original
 * numeric keys.
 */
function array_merge_unique(array $array1 /* [, array $...] */) {
  $result = array_flip(array_flip($array1));
  foreach (array_slice(func_get_args(),1) as $arg) { 
    $result = 
      array_flip(
        array_flip(
          array_merge($result,$arg)));
  } 
  return $result;
}


0 commentaires

20
votes

La solution la plus élégante, la plus simple et efficace est celle mentionnée dans la question originale ... xxx

Cette réponse a également été mentionnée précédemment dans les commentaires de Ben Lee et DoubleJosh, mais je Je l'affiche ici comme une réponse réelle au profit d'autres personnes qui trouvent cette question et souhaitent savoir quelle solution la meilleure solution est sans lire tous les commentaires sur cette page.


1 commentaires

Élégant et simple, oui, mais seulement finalement le plus efficace. Copier et trier un tableau ne deviendra pas efficace tant que la matrice est suffisamment grande.