سؤال

وأنا حاليا باستخدام 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'

هل هناك طريقة أفضل يمكنني أن أكون إزالة عدد معين من السلسلة؟

وشكرا.

هل كانت مفيدة؟

المحلول

هل يمكن أن تنفجر السلسلة إلى صفيف:

$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)

وربما ليس كما "بسيطة" وذلك باستخدام التعابير المنطقية. ولكن في اليوم ستحتاج إلى بذل المزيد من الجهد مع عناصر (أو النهار العناصر الخاصة بك هي أكثر تعقيدا من أرقام واضحة تماما)، التي سوف لا تزال تعمل: -)


وتحرير: وإذا كنت ترغب في إزالة القيم "فارغة"، مثل عندما يكون هناك نوعان فاصلة، عليك أن modifiy الشرط، قليلا مثل هذا:

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

وأي استبعاد $values التي تكون فارغة. يستخدم "trim" لذلك يمكن أيضا أن يتم التعامل مع $string = "22,23, ,24,25";، راجع للشغل.

نصائح أخرى

وثمة مسألة أخرى هي إذا كان لديك المستخدم 5 ومحاولة لإخراجها، وكنت أنتقل 15 إلى 1، 25 في 2، وما إلى ذلك عليك أن تحقق من وجود فاصلة على كلا الجانبين.

إذا كنت تريد أن يكون سلسلة محددة من هذا القبيل، كنت وضعت فاصلة على طرفي كل من البحث وقائمة، على الرغم من انها تريد ان تكون فعالة إذا كان يحصل على فترة طويلة جدا.

ومثال ستكون كما يلي:

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

وخيار مماثل لباسكال، على الرغم من أنني أعتقد أن 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;
}

والأساس، وتحويل السلسلة إلى صفيف، العثور على هوية المستخدم، إذا كان موجودا، إلغاء تعيين ومن ثم تنهار مجموعة مرة أخرى.

وأود أن أذهب طريقة بسيطة: إضافة الفواصل حول القائمة الخاصة بك، استبدال "، 23"، مع فاصلة واحدة ثم إزالة الفواصل إضافية. سريعة وبسيطة.

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

وقال مع ذلك، والتلاعب القيم في قائمة مفصولة بفواصل عادة التوقيع من تصميم سيئة. وينبغي أن تكون تلك القيم في مجموعة بدلا من ذلك.

وحاول استخدام 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'; Update2: تغير $pattern = '/' . $usrID . ',?/i إلى $pattern = '/\b' . $usrID . '\b,?/i' لمعالجة onnodb التعقيب ...

وسيلة بسيطة (توفير جميع أرقام أرقام 2):

$string = str_replace($userId, ',', $string);
$string = str_replace(',,','', $string);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top