Pregunta

Actualmente estoy usando str_replace para eliminar un usrID y la 'coma' inmediatamente después:

Por ejemplo:

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

Sin embargo, he notado que si:

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

No funciona, porque no hay una 'coma' al final del '25'

¿Hay alguna manera mejor de eliminar un número específico de la cadena?

Gracias.

¿Fue útil?

Solución

PUEDE explotar la cadena en una matriz:

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

Que te dará:

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

Luego, haz lo que quieras en esa matriz; como eliminar la entrada que ya no quieres:

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

Que te da:

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

Y, finalmente, vuelva a armar las piezas:

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

Y obtienes lo que querías:

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

Tal vez no como "simple" como una expresión regular; pero el día que necesitará hacer más con sus elementos (o el día en que sus elementos sean más complicados que solo números simples), eso seguirá funcionando :-)


EDITAR: y si desea eliminar " vacío " valores, como cuando hay dos comas, solo tiene que modificar la condición, un poco como esto:

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

es decir, excluir los $ valores que están vacíos. El " trim " se usa para que $ string = " 22,23,, 24,25 " ;; también se pueda tratar, por cierto.

Otros consejos

Otro problema es que si tienes un usuario 5 e intentas eliminarlo, convertirías 15 en 1, 25 en 2, etc. Por lo tanto, deberías buscar una coma en ambos lados.

Si desea tener una cadena delimitada como esa, pondría una coma en ambos extremos de la búsqueda y la lista, aunque sería ineficiente si se alarga mucho.

Un ejemplo sería:

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

Una opción similar a la de Pascal, aunque creo que es un poco simple:

$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;
}

Básicamente, convierta la cadena en una matriz, encuentre la ID de usuario, si existe, desarme y luego implosione la matriz nuevamente.

Yo iría de la manera más simple: agregue comas alrededor de su lista, reemplace ", 23, " con una coma simple y luego elimine las comas adicionales. Rápido y simple.

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

Dicho esto, manipular valores en una lista separada por comas suele ser signo de un mal diseño. Esos valores deberían estar en una matriz en su lugar.

Intente usar preg:

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

Actualización: cambió $ pattern = '/ $ usrID,? / i'; a $ pattern = '/'. $ usrID. ',? / i'; Actualización2: cambió $ pattern = '/'. $ usrID. ',? / i a $ pattern =' / \ b '. $ usrID. '\ b,? / i' para abordar el comentario de onnodb ...

Forma simple (proporcionando los números de 2 dígitos):

$string = str_replace($userId, ',', $string);
$string = str_replace(',,','', $string);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top