9
votes

Comment fusionner des valeurs de banlieue et supprimer des doublons?

$arr[] = array('A','B');
$arr[] = array('C','B');
...
I need to get the merged result of all sub array of $arr .And for duplicated entries,should fetch only one.

0 commentaires

7 Réponses :


8
votes
$result_arr = array();
foreach ($arr as $sub_arr) $result_arr = array_merge($result_arr, $sub_arr);
$result_arr = array_unique($result_arr);

9 commentaires

Il peut avoir plus de 2 sous-tableaux.


Le nombre de sous-tableaux est dynamique.


Bien que l'auteur ne donne que $ ARR 0 + 1 à titre d'exemple, je pense qu'ils ont besoin d'une solution pour accueillir tous les articles enfants d'ARR $.


Y a-t-il un moyen de le faire autre que la boucle?


Pourquoi? Quel est le problème avec une boucle? Je suppose que vous pourriez utiliser une sorte de fonction de mappage. Regardez la section Array des Documents PHP pour d'autres idées. php.net/manual/fr/ref.array.php


Si le nombre de tableaux est dynamique, je pense que les boucles pourraient être le meilleur choix. Pourquoi ne voudriez-vous pas de boucle?


Existe-t-il une fonction de tableau qui peut gérer ce problème?


Array_walk () est une possibilité, mais c'est plus de frais généraux


Il n'est toujours pas correct, il doit être $ résultat_arr = array_merge ($ résultat_arr, $ sub_arr);



15
votes

OK à travers une autre question que j'ai découvert que ce qui suit est réellement possible (je me suis essayé sans succès, j'avais la mauvaise version) si vous utilisez la version PHP> = 5.3.0 strong>:

$unique_values = array();

function unique_value($value, &$target_array) {
    if(!in_array($value, $target_array, true))
        $target_array[] = $value;
}

array_walk($merged_values, 'unique_value', $unique_values);


2 commentaires

Je ne pense pas $ fusible_array = array_merge ($ Ar); Va réellement rompre les sous-tableaux, ce que je suis sûr, c'est ce que l'OP demandait.


Vaut la peine de noter que Array_merge devrait être entre citations par exemple. 'Array_Merge'



25
votes

Si vous ne voulez vraiment pas boucler, essayez ceci:

$arr[] = array('A','B');
$arr[] = array('C','B');
$arr[] = array('C','D');
$arr[] = array('F','A');
$merged = array_unique(call_user_func_array('array_merge', $arr));


3 commentaires

Je pense qu'il n'y a pas besoin de array_unique comme array_merge écrasera les touches en double si elles ont été trouvées. Quelqu'un peut-il me répondre s'il vous plaît?


Sans le 'Array_Merge' L'erreur suivante apparaît "errorxception: call_user_func_array () attend exactement 2 paramètres" @ankit


Genius, l'un des rares cas où nous pouvons réellement utiliser call_user_func_array et c'est comme un ajustement parfait pour ce genre de chose.



1
votes

$ fusible_array = array_reduce ($ SERP_RES, 'Array_Merge', tableau ()); Avec des quotas ajoutés, 'Array_Merge', a travaillé pour moi.


0 commentaires

1
votes

Cette réponse est basée sur Felix Kling Post. C'est une version plus précise avec des sous-éléments de fixation "non-réseau".

$res = array_reduce($res, function(&$res, $v) {
                            return array_merge($res, (array) $v);
                        }, array());


1 commentaires

Grande solution et utilisez Array_Filter () pour vous débarrasser des éléments de tableau vides causés par des valeurs de réseau vides ou des cordes ajoutées précédemment. Voici la version finale: $ res = array_filter (Array_reduce ($ res, fonction (& $ res, $ v) {return array_merge ($ res, (tableau) $ v);}, tableau ());



1
votes

pour PHP 5.6 avec l'opérateur SPLAT:

array_unique(array_merge(...$arr));


0 commentaires

1
votes

Un moyen simple de gérer cela dans la version PHP > = 5.6 code> est d'utiliser l'opérateur de splat également appelé Argument Déballage .

$arr = array_unique(array_merge(...$arr));


0 commentaires