Question

J'utilise actuellement str_replace pour supprimer un ID utilisateur et la virgule immédiatement après:

Par exemple:

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

Cependant, j'ai remarqué que si:

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

Cela ne fonctionne pas, car il n'y a pas de "virgule" après le "25"

Existe-t-il un meilleur moyen de supprimer un nombre spécifique de la chaîne?

Merci.

Était-ce utile?

La solution

Vous pourriez faire éclater la chaîne dans un tableau:

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

Ce qui vous donnera:

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

Ensuite, faites ce que vous voulez sur ce tableau; comme supprimer l'entrée que vous ne voulez plus:

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

Ce qui vous donne:

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

Et enfin, remettez les morceaux ensemble:

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

Et vous obtenez ce que vous vouliez:

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

Peut-être pas comme "simple" comme une regex; mais le jour où vous aurez besoin de faire plus avec vos éléments (ou le jour où vos éléments sont plus compliqués que de simples chiffres), cela fonctionnera toujours: -)

EDIT: et si vous souhaitez supprimer " empty " valeurs, comme quand il y a deux virgules, il vous suffit de modifier la condition, un peu comme ceci:

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

Autrement dit, excluez les $ valeurs qui sont vides. Le " trim " est utilisé pour que $ string = "22,23, 24,25" puisse également être traité, au fait.

Autres conseils

Un autre problème est que si vous avez un utilisateur 5 et essayez de le supprimer, vous transformez 15 en 1, 25 en 2, etc. Il vous faudra donc vérifier la présence d’une virgule des deux côtés.

Si vous voulez avoir une chaîne délimitée comme celle-là, je mettrais une virgule aux deux extrémités de la recherche et de la liste, bien que ce serait inefficace si elle devient très longue.

Un exemple serait:

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

Une option similaire à celle de Pascal, bien que je pense un peu 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;
}

Fondamentalement, convertissez la chaîne en tableau, recherchez l'ID utilisateur, le cas échéant, supprimez-la, puis implodez à nouveau le tableau.

Je choisirais le moyen le plus simple: ajoutez des virgules autour de votre liste, remplacez ", 23,". avec une seule virgule puis supprimez les virgules supplémentaires. Rapide et simple.

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

Cela dit, manipuler des valeurs dans une liste séparée par des virgules est généralement le signe d’un mauvais design. Ces valeurs doivent plutôt être dans un tableau.

Essayez d’utiliser preg:

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

Mise à jour: changé $ pattern = '/ $ usrID,? / i'; en $ pattern = '/'. $ usrID. ',? / i'; Update2: a changé $ pattern = '/'. $ usrID. ',? / i à $ pattern =' / \ b '. $ usrID. '\ b,? / i' pour adresser le commentaire de onnodb ...

Manière simple (fournir tous les nombres à 2 chiffres):

$string = str_replace($userId, ',', $string);
$string = str_replace(',,','', $string);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top