PHP str_replace - PullRequest
       31

PHP str_replace

1 голос
/ 04 августа 2009

В настоящее время я использую str_replace для удаления идентификатора usrID и «запятой» сразу после него:

Например:

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

Однако я заметил, что если:

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

Это не работает, потому что после '25'

нет запятой 'после запятой'.

Есть ли лучший способ удалить конкретное число из строки?

Спасибо.

Ответы [ 6 ]

2 голосов
/ 04 августа 2009

Опция, похожая на Паскаль, хотя я думаю, что немного похожи:

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

По сути, преобразовать строку в массив, найти идентификатор пользователя, если он существует, сбросить его, а затем снова сжать массив.

2 голосов
/ 04 августа 2009

Вы можете взорвать строку в массив:

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

Что даст вам:

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

Затем делайте что хотите в этом массиве; как удалить запись, которую вы больше не хотите:

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

Что дает вам:

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

И, наконец, соберите части вместе:

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

И вы получаете то, что хотели:

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

Может быть, не так "просто", как регулярное выражение; но в тот день, когда вам нужно будет сделать больше с вашими элементами (или в тот день, когда ваши элементы сложнее, чем просто числа), это все равно будет работать: -)


РЕДАКТИРОВАТЬ: и если вы хотите удалить «пустые» значения, например, когда есть две запятые, вам просто нужно изменить условие, примерно так:

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

т.е. исключить пустые $values. «trim» используется, поэтому с $string = "22,23, ,24,25"; также можно справиться, кстати.

2 голосов
/ 04 августа 2009

Другая проблема заключается в том, что если у вас есть пользователь 5 и вы пытаетесь удалить его, вы превратите 15 в 1, 25 в 2 и т. Д. Поэтому вам придется проверять запятую с обеих сторон.

Если вы хотите иметь такую ​​строку с разделителями, я бы поставил запятую на обоих концах поиска и списка, хотя это было бы неэффективно, если бы оно получалось очень длинным.

Примером может быть:

$receivers = substr(str_replace(','.$usrID.',', ',', ','.$string.','),1,-1);
0 голосов
/ 04 августа 2009

Я бы пошел простым путем: добавьте запятые вокруг списка, замените ", 23" на одну запятую, затем удалите лишние запятые Быстро и просто.

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

С учетом сказанного, манипулирование значениями в списке через запятую обычно является признаком плохого дизайна. Вместо этого эти значения должны быть в массиве.

0 голосов
/ 04 августа 2009

Простой способ (предоставление всех двухзначных чисел):

$string = str_replace($userId, ',', $string);
$string = str_replace(',,','', $string);
0 голосов
/ 04 августа 2009

Попробуйте использовать preg:

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

Обновление: изменено $pattern = '/$usrID,?/i'; на $pattern = '/' . $usrID . ',?/i'; Обновление 2: изменено $pattern = '/' . $usrID . ',?/i на $pattern = '/\b' . $usrID . '\b,?/i' для учета комментариев onnodb ...

...