PHP-Can';无法从foreach循环中获取匹配的值

PHP-Can';无法从foreach循环中获取匹配的值,php,arrays,for-loop,Php,Arrays,For Loop,我正在尝试创建一个循环,检测您是否输入了被禁止的用户名。但是,我想向用户报告进行了什么匹配,以确定使用了什么关键字来禁止该名称。你觉得这有什么不对吗 function matchusername($bannedusername, $username) { foreach($bannedusername as $bannedusernam => $value){ if (strpos($username, $bannedusernam) !== false) {

我正在尝试创建一个循环,检测您是否输入了被禁止的用户名。但是,我想向用户报告进行了什么匹配,以确定使用了什么关键字来禁止该名称。你觉得这有什么不对吗

function matchusername($bannedusername, $username)
{
    foreach($bannedusername as $bannedusernam => $value){
        if (strpos($username, $bannedusernam) !== false) {
            $offendingusername = $value;
            return true;
        }
    }
    return false;
}
我还有一些代码,可以检查有效的注释以及其他各种内容

当我添加
=>
$value
$officingUserName=$value它似乎只是打破了这个循环并跳过它,并且允许用户无论如何发布。当我去掉这两个部分时,它会检测到一个被禁止的用户名,并且不允许你发布它应该发布的内容,但我真的希望它能报告匹配的值,这样在用户写长评论的情况下,他们可以看到为什么他们不能发布


我看过很多其他的资料,这看起来是一种方法,但它不起作用。有什么想法吗?谢谢。

看来您在foreach循环中混合了键和值 变量$BannedUserName是数组键

为了修复返回,我将使用一个布尔变量,并在找到匹配项后使用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;
  } 
}

您应该将
$officingUserName
声明为全局

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)
{
    ...
}

更新的答案

请运行
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.';

}
if($user=matchusername($username,$banndUserName)){
echo$user。“您有一个被禁止的用户名。
”; }否则{ echo“你的帖子很成功”; }
$bannedusername是一个由禁用的关键字(如“admin”和亵渎)组成的数组$IscrokingUserName只是一个空变量,我正试图分配它,以便在错误消息中调用它。很难说什么不起作用,因为这个php页面是通过ajax调用的,而这个页面应该处理其余的内容。所以我没有办法真正了解它在做什么或不在做什么。我试着去掉=>$value,只调用$bannedusernam,这会调用代码,但是很明显,变量是空的,因为调用时它是空的。但是当我将代码设置为上面所示的值时,它实际上会完全跳过该函数,就像某种语法是错误的一样。我通过一个语法检查器运行了它,它应该是好的。如果我使用了$value和$officingUserName=$value,它将运行代码并能够检测到错误的用户名,但这意味着我无法在错误消息中引用它。这成功地运行了代码,但当我回显该值时,它是空的。正如另一个答案中指出的,officingUserName变量是fubxtion的lkcal。您可以添加它的全局定义,也可以返回它。我将给出我对wnd选项的答案。我在调用函数之前创建了变量,因此它应该已经是全局变量。不幸的是,它没有返回任何结果。好吧,我找到了一个解决方案。由于我只能从函数内部回显它(出于某种原因),所以我只是回显函数中的整个错误消息,并将if语句留空。现在它可以正常工作了,只需对现有代码进行最小的修改。我很感激你为我指明了正确的方向。仍然不确定为什么它不能与所有其他答案一起工作,但是如果你以后觉得无聊并且想深入研究它,请告诉我你发现了什么。不管怎样,我现在都好了。谢谢这两个函数的作用与我的代码相同,完全跳过函数,允许用户发布。@Syllith请提供
$bannedusername
的结构或一些示例。