wake-up-neo.com

duplikat aus Zeichenfolge entfernen PHP

Ich suche den schnellsten Weg, um doppelte Werte in einer durch Kommas getrennten Zeichenfolge zu entfernen.

So sieht meine Saite so aus;

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

Ich kann es machen, die Zeichenfolge in Werte aufzulösen und dann zu vergleichen, aber ich denke, es wird langsam sein. Was ist mit Preg_replace (), wird es schneller sein? Hat jemand diese Funktion verwendet?

29
Adnan

Der kürzeste Code wäre:

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

Wenn es das schnellste ist ... weiß ich nicht, es ist wahrscheinlich schneller als explizit zu schleifen.

Referenz: implode , array_unique , explode

117
Felix Kling

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

Wenn Sie den String an einem beliebigen Punkt "Up Script" generieren, sollten Sie Duplikate entfernen, sobald sie auftreten.

Angenommen, Sie verwenden eine Verkettung, um Ihre Zeichenfolge zu generieren:

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

... dann müssten Sie eindeutige Werte aus $string basierend auf dem Trennzeichen (Komma) extrahieren und dann mit dem Trennzeichen erneut implodieren.


Ich schlage vor, dass Sie eine direktere Methode entwerfen und Duplikate innerhalb der ursprünglichen Foreach-Schleife wie folgt ablehnen:

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

Dies funktioniert, weil niemals doppelte Werte existieren dürfen. Alle nachfolgenden Vorkommen werden zum Überschreiben des früheren Vorkommens verwendet. Dieser funktionslose Filter funktioniert, da Arrays möglicherweise nicht zwei identische Schlüssel in demselben Array (Ebene) haben.

Alternativ können Sie das "Überschreiben" der Array-Daten in der Schleife vermeiden, indem Sie if(!isset($array[$return_value])){$array[$return_value]=$return_value;} aufrufen. Der Unterschied bedeutet jedoch, dass die Funktion isset() bei jeder Iteration aufgerufen wird. Der Vorteil der Verwendung dieser Assoziativschlüsselzuweisungen besteht darin, dass der Prozess die Verwendung von in_array() vermeidet, die langsamer als isset() ist.

Alles in allem, wenn Sie eine Datenspalte aus einem 2-dimensionalen Array extrahieren, wie:

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

Dann könnten Sie die Magie von array_column() ohne eine Schleife wie folgt nutzen:

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

Und für alle, die sich für Mikrooptimierung interessieren, sei bemerkt, dass der Aufruf von array_unique() tatsächlich langsamer ist als einige Methoden mit zwei Funktionen. Lesen Sie hier für weitere Details.

Unter dem Strich gibt es viele Möglichkeiten, diese Aufgabe auszuführen. explode->unique->implode kann in einigen Fällen die präziseste Methode sein, wenn Sie die Trennzeichenfolge nicht generieren, aber es ist wahrscheinlich nicht die direkteste oder schnellste Methode. Wählen Sie selbst aus, was für Ihre Aufgabe am besten ist.

0
mickmackusa