supprimer les doublons de la chaîne de caractères en PHP

je suis à la recherche du moyen le plus rapide pour supprimer les valeurs dupliquées dans une chaîne de caractères séparée par des virgules.

donc ma chaîne ressemble à ceci;

$str = 'one,two,one,five,seven,bag,tea';

je peux le faire en faisant exploser la chaîne aux valeurs et ensuite comparer, mais je pense que ce sera lent. qu'en est preg_replace (), il sera plus rapide? Un fait à l'aide de cette fonction?

29
demandé sur Adnan 2010-04-10 14:39:51

2 réponses

le code le plus court serait:

$str = implode(',',array_unique(explode(',', $str)));

si c'est le plus rapide... Je ne sais pas, il est probablement plus rapide que la boucle explicitement.

de Référence: implode , array_unique , explode

112
répondu Felix Kling 2010-04-10 10:41:47

: $string = 'one,two,one,five,seven,bag,tea';

si vous générez la chaîne à un point quelconque" up script", alors vous devriez éliminer les doublons au fur et à mesure qu'ils se produisent.

disons que vous utilisez la concaténation pour générer votre chaîne comme:

$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').some_func($value);
}

...ensuite, vous devrez extraire des valeurs uniques de $string basées sur le délimiteur (virgule), puis ré-imploser avec le délimiteur.


je suggère que vous conceviez une méthode plus directe et niez les doubles à l'intérieur de la boucle foreach initiale, comme ceci:

foreach($data as $value){
    $return_value=some_func($value);  // cache the returned value so you don't call the function twice
    $array[$return_value]=$return_value;  // store the return value in a temporary array using the function's return value as both the key and value in the array.
}
$string=implode(',',$array);  // clean: no duplicates, no trailing commas

cela fonctionne parce que les valeurs dupliquées ne sont jamais autorisées à exister. Tous les événements subséquents seront utilisés pour remplacer l'événement antérieur. Ce filtre sans fonction fonctionne parce que les tableaux peuvent ne pas avoir deux clés identiques dans le même tableau(niveau).

Alternativement, vous pouvez éviter "overwriting" données du tableau dans la boucle, en appelant if(!isset($array[$return_value])){$array[$return_value]=$return_value;} mais la différence signifie appeler la fonction isset() sur chaque itération. L'avantage d'utiliser ces attributions de clés associatives est que le processus évite d'utiliser in_array() qui est plus lent que isset() .

tout ce qui dit, si vous extrayez une colonne de données d'un tableau bidimensionnel comme:

$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').$value['word'];
}

alors vous pourriez tirer parti de la magie de array_column() sans boucle comme ceci :

echo implode(',',array_column($str,'word','word'));

et enfin, pour ceux qui s'intéressent à la micro-optimisation, je note que l'appel unique de array_unique() est en fait plus lent que quelques méthodes à deux fonctions. lire ici pour plus de détails.

la ligne de fond est, il ya plusieurs façons d'effectuer cette tâche. explode->unique->implode peut être la méthode la plus concise dans certains cas si vous ne génèrent pas la chaîne délimitée, mais il est peu probable que ce soit la méthode la plus directe ou la plus rapide. Choisissez pour vous-même ce qui est le mieux pour votre tâche.

0
répondu mickmackusa 2018-02-01 02:46:34