PHP foreach循环弄乱了我的in_array函数

时间:2016-01-26 19:08:24

标签: php mysql arrays

我编写了一个脚本,用于检查通过textarea接收的名称的批量输入,并省略数据库中已有的所有值。如果您只输入一个重复的名称,它就有效。如果输入两个或更多,它将过滤掉第一个重复的名称,将其余名称视为唯一名称并将其插入数据库中。我无法弄清楚原因。

首先,这是一个内置于脚本另一部分的数组。它是从数据库查询生成的:

Array
(
    [0] => john
    [1] => peter
    [2] => max
    [3] => jake
)

此数组称为$ onlyHandles。然后这是脚本:

if((isset($_POST['extract']) && !empty($_POST['extract']))){
    $handles = trim($_POST['extract']);
    $handles = explode("\n", $handles);

        if(count($handles)>200){
            echo 'error';
            exit(1);
        }

        foreach($handles as $handle) {
            $handleRep = strtolower(str_replace('@','',$handle));
            $handleClean = str_replace(str_split('\\/:*?&"<>=+-#%$|'), ' ', $handleRep, $count);

                if ($count > 0) {
                    echo 'error';
                    exit(1);
                }
                else{

                    if (in_array($handleClean, $onlyHandles)){
                        $delmessage .= "<p>".$handleClean." is already in your list.</p>";
                    }
                    else{
                        $sqlIns = "INSERT INTO...blah blah blah)";
                        $resultIns = mysql_query($sqlIns);
                        $resInsArr[] = array($resultIns);

                    }
                }
        }
        $countresIns = count($resInsArr);
            if ($countresIns > 0){
                $delmessage .= "<p>User(s) added to list succesfully!</p>" ;
            }
}

现在,如果你在textarea中输入“john”,它会喊出这个名字已经存在。如果输入“john”和“max”,它将省略john并添加最大值

非常感谢任何帮助。

P.S。关于查询格式,我知道,我知道,谢谢!

3 个答案:

答案 0 :(得分:0)

我想告诉大家如何实现它:

  1. 替换第一行:

    if((isset($ _ POST [&#39; extract&#39;])&amp;&amp;!empty($ _ POST [&#39; extract&#39;]))){

  2. 通过

    if((!empty($_POST['extract']))){
    

    因为!empty已经向你保证isset

    的保证
    1. 我在玩一些特殊的角色
    2. U也可以使用正则表达式的力量来替换不需要的字符 在替换:

      第12行:$handleClean = str_replace(str_split('\\/:*?&"<>=+-#%$|'), ' ', $handleRep, $count);

      通过:

      $handleClean = preg_replace("/\[\/:\*?&\"<>=\+-#%\$\|\]*/", ' ', $handleRep, $count);

      1. 在Ur For-Loop中,重构以下几行:
      2. 第2行:$handles = trim($_POST['extract']);

        通过(修剪不是必要的)

        $handles = $_POST['extract'];

        第11行:$handleRep = strtolower(str_replace('@','',$handle));

        通过

        $handleRep = trim(strtolower(str_replace('@','',$handle)));

        嘿; - ),

        你还应该添加一些print_r(...)来调试每一步

答案 1 :(得分:0)

感谢@Ulrich Tevi Horus让我的代码更清洁,但没有解决神秘消失的用户。 @shulard,你应该发布这个作为获得upvote的答案。 array_diff确实是最好的解决方案。 这是最终的代码。需要一些整理,但它足以让我的服务器进行测试。

//this is the current contents of the list:
$onlyHandles = array();
foreach ($organizedArray as $key2 => $val2) {
    $onlyHandles[] = $val2['name'];
}
echo "<br>begin onlyhandles<br>";
print_r($onlyHandles);
echo "<br>end onlyhandles<br>";
//finish preparation for display    

//if names submitted for the list list
if(!empty($_POST['extract'])){
    $handles = trim($_POST['extract']);
    $handles = explode("\n", $handles); //this is now an array
    echo "<br>begin handles<br>";
    print_r($handles);
    echo "<br>end handles<br>";
    //$countInput = count($handles);

        if($countInput>200){
            echo '<p style="color:red;">Please Enter fewer than 200 names!</p>';
            exit(1);
        }
        else{

            $handleFinal = array();
                foreach($handles as $handle) {
                    //$handleRep = strtolower(str_replace('@','',$handle));
                    $handleRep = trim(strtolower(str_replace('@','',$handle)));
                    $handleClean = str_replace(str_split('\\/:*?&"<>=+ -#%$|'), 'p', $handleRep, $count);
                    //$handleClean = preg_replace("/\[\/:\*?&\"<>=\+-#%\$\|\s+\]*/", ' ', $handleRep, $count);
                    echo "handleClean: ".$handleClean."<br>";

                        if ($count > 0) {
                            echo '<p style="color:red;">Your input contained special characters.</p>';
                            exit(1);
                        }
                        else{
                                $handleFinal[] = $handleClean;
                        }
                }//end foreach

        }//finish checking count input number

    echo "<br>begin handleFinal<br>";
    print_r($handleFinal);
    echo "<br>end handleFinal<br>";

    $countFinal = count($handleFinal);
    echo "<br>countfinal is ".$countFinal."<br>";
    //check if this user is already in the list
    $handleDiffs = array_diff($handleFinal,$onlyHandles);

    echo "<br>begin handlediffs<br>";
    print_r($handleDiffs);
    echo "<br>end handlediffs<br>";

        foreach($handleDiffs as $handleDiff) {
            $sqlIns = "blah blah blah";
            $resultIns = mysql_query($sqlIns);
            $resInsArr[] = array($resultIns);

        }

    $countresIns = count($resInsArr);
        if ($countresIns > 0){
            $delmessage .= "<p>User(s) added to the list succesfully!</p>" ;
        }
}

答案 2 :(得分:0)

我发布我的comment answer作为真正的答案:)

您必须修剪$handle变量,因为它周围可能有一些空格...

然后关于你的问题,我不明白。您的代码似乎&#34;干净&#34;,也许您应该考虑将strict标记设置为true,请参阅function definition here