PHP - Не удается получить соответствующее значение из цикла foreach - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь сделать цикл, который будет определять, если вы ввели забаненное имя пользователя.Но я хочу сообщить пользователю, какое совпадение было сделано, чтобы определить, какое ключевое слово использовалось для запрета имени.Видите ли вы что-то не так с этим?

function matchusername($bannedusername, $username)
{
    foreach($bannedusername as $bannedusernam => $value){
        if (strpos($username, $bannedusernam) !== false) {
            $offendingusername = $value;
            return true;
        }
    }
    return false;
}

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

Когда я добавляю => $value и $offendingusername = $value;, кажется, что он просто разрывает этот цикл, пропускает его и позволяет пользователю публиковать в любом случае.Когда я уберу эти две части, он обнаружит забаненное имя пользователя и не позволит вам публиковать, как следует, но я бы очень хотел, чтобы он сообщал о сопоставленном значении обратно, поэтому в случае, если пользователи пишут длинный комментарий, они могутпонять, почему они не могут публиковать сообщения.

Я просмотрел множество других источников, и похоже, что это способ сделать это, но он не работает.Есть идеи?Спасибо.

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Вы должны объявить $offendingusername глобальным.

function matchusername($bannedusername, $username)
{
    global $offendingusername;

    foreach($bannedusername as $bannedusernam => $value){
        if (strpos($username, $bannedusernam) !== false) {
            $offendingusername = $value;
            return true;
        }
    }
    return false;
}

Другая идея - вернуть совпадение и проверить его.

function matchusername($bannedusername, $username)
{
    foreach($bannedusername as $bannedusernam => $value){
        if (strpos($username, $bannedusernam) !== false) {
            return $value;
        }
    }
    return false;
}

$ret = matchusername($bannedusername, $username);
if($ret !== false)
{
    ...
}
0 голосов
/ 23 сентября 2018

Обновленный ответ

Пожалуйста, запустите print_r($bannedusername); и опубликуйте свой ответ, чтобы мы могли видеть, с каким типом данных мы работаем.

Но до этого попробуйте:

function matchusername($username, $bannedusername){

foreach($bannedusername as $badWord){
    if (strpos($username, $badWord) !== FALSE) {
        return $username;
    }
}
return FALSE;
}

Вот как вы бы это использовали:

if($user = matchusername($username, $bannedusername)){

  echo $user . ' You have a banned username.<br>';

}else{

  echo 'Your post was successful.';

}
0 голосов
/ 23 сентября 2018

Кажется, что вы смешали между ключом и значением в цикле foreach, ваша переменная $ bannedusernam - это ключ массива

, чтобы исправить возвращаемое значение, я буду использовать логическую переменную и использую break для полученияforeach, когда совпадение найдено

function matchusername($bannedusername, $username)
{
 $ret = false;
    foreach($bannedusername as $key => $value){
        if (strpos($username, $value) !== false) {
            $offendingusername = $value;
             $ret = true;
             break;
        }
    }

   if ($ret)
   {
 return $offendingusername;
  } else {
    return $ret;
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...