Frage

Ich bin derzeit mit str_replace ein USRID und das ‚Komma‘ unmittelbar nach dem es zu entfernen:

Zum Beispiel:

$usrID = 23;
$string = "22,23,24,25";
$receivers = str_replace($usrID.",", '', $string);  //Would output: "22,24,25"

Aber ich habe bemerkt, dass, wenn:

$usrID = 25; //or the Last Number in the $string

Es funktioniert nicht, weil es keinen Hinter ‚Komma‘ nach den ‚25‘

ist

Gibt es eine bessere Art, wie ich eine bestimmte Anzahl aus dem String entfernt sein kann?

Danke.

War es hilfreich?

Lösung

Sie die Zeichenfolge in ein Array explodieren könnte:

$list = explode(',', $string);
var_dump($list);

Welche gibt Ihnen:

array
  0 => string '22' (length=2)
  1 => string '23' (length=2)
  2 => string '24' (length=2)
  3 => string '25' (length=2)

Dann tun, was Sie an diesem Array wollen; wie entfernen Sie den Eintrag, den Sie will nicht mehr:

foreach ($list as $key => $value) {
    if ($value == $usrID) {
        unset($list[$key]);
    }
}
var_dump($list);

Was gibt Ihnen:

array
  0 => string '22' (length=2)
  2 => string '24' (length=2)
  3 => string '25' (length=2)

Und schließlich setzt die Stücke wieder zusammen:

$new_string = implode(',', $list);
var_dump($new_string);

Und Sie bekommen, was Sie wollen:

string '22,24,25' (length=8)

Vielleicht nicht so „einfach“ als regex; aber der Tag Sie brauchen mehr mit Elementen zu tun (oder dem Tag, um Ihre Elemente sind komplizierter als nur ganze Zahlen), das wird immer noch funktionieren: -)


EDIT: und wenn Sie wollen „leeren“ Werte zu entfernen, wie wenn es zwei Komma, man muss nur den Zustand modifizieren, ein bisschen wie folgt aus:

foreach ($list as $key => $value) {
    if ($value == $usrID || trim($value)==='') {
        unset($list[$key]);
    }
}

dh ausschließen $values, die leer sind. Die "trim" wird verwendet, so $string = "22,23, ,24,25"; können auch behandelt werden, btw.

Andere Tipps

Ein weiteres Problem ist, wenn Sie einen Benutzer 5 haben und versuchen, sie zu entfernen, werden Sie 15 in 1 drehen würden, 25 in 2, etc. So können Sie auf beiden Seiten für ein Komma überprüfen müßten.

Wenn Sie eine getrennte Zeichenfolge so haben wollen, ich ein Komma an beiden Enden sowohl die Suche und die Liste setzen würde, obwohl es ineffizient sein würde, wenn es sehr lang wird.

Ein Beispiel wäre:

$receivers = substr(str_replace(','.$usrID.',', ',', ','.$string.','),1,-1);

Eine Option ähnlich wie Pascal, obwohl ich denke, ein bisschen simipler:

$usrID = 23;
$string = "22,23,24,25";
$list = explode(',', $string);
$foundKey = array_search($usrID, $list);
if ($foundKey !== false) {
    // the user id has been found, so remove it and implode the string
    unset($list[$foundKey]);
    $receivers = implode(',', $list);
} else {
    // the user id was not found, so the original string is complete
    $receivers = $string;
}

Im Grunde genommen die Zeichenfolge in ein Array umwandeln, die Benutzer-ID finden, wenn es vorhanden ist, ungesetzt es und dann wieder das Array implodieren.

würde ich den einfachen Weg gehen: in Kommas um Ihre Liste ersetzen „23“, mit einem einzigen Komma dann zusätzliches Komma entfernen. Schnell und einfach.

$usrID = 23;
$string = "22,23,24,25";
$receivers = trim(str_replace(",$usrID,", ',', ",$string,"), ',');

Wenn das gesagt wird Wert in einer kommagetrennte Liste Manipulation in der Regel von einem schlechten Design unterzeichnen. Diese Werte sollten stattdessen in einem Array sein.

Versuchen Sie Preg mit:

<?php
$string = "22,23,24,25";
$usrID = '23';
$pattern = '/\b' . $usrID . '\b,?/i';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);
?>

Update: geändert $pattern = '/$usrID,?/i'; $pattern = '/' . $usrID . ',?/i'; Update2: geändert $pattern = '/' . $usrID . ',?/i $pattern = '/\b' . $usrID . '\b,?/i' Kommentar zur Adresse onnodb der ...

Einfache Art und Weise (vorausgesetzt, alle 2-stellige Zahlen):

$string = str_replace($userId, ',', $string);
$string = str_replace(',,','', $string);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top