两个阶段的in_array检查问题,不允许处理第二个语句

时间:2013-03-30 20:59:34

标签: php mysql arrays scope

背景

我正在创建一个从一个表中提取信息的方法,检查它是否存在于第二个表中,如果没有,则插入信息。在比较数据时,检查必须首先查看名称是否匹配,然后继续检查帐号是否与相应的名称匹配。此代码有很多注释,因此也可以遵循一步一步的过程。我非常感谢stackexchange的主人带来的所有帮助,所以在抓了一会儿之后,我把问题带到了桌面上。

显然,即使存在匹配的名称,我的代码在检查帐号时也会中断。根据我的最佳技能,所有代码都应该完美运行。

由于您将能够看到all_validation_names的print_f以及all_validation_accounts,所以第一个传递语句的信息包含在带有检查的数组中。

我的问题如下:为什么不能将存储在具有相应键($ check_account_number)的数组中的varchar变量传递给in_array。该函数总是返回else,尽管变量为“1”,但使用$ all_validation_accounts中的相应键找不到它。

请帮忙!

脚本处理代码

        if (in_array($check_agency_name,$all_validation_names))
        { 

            //Set a marker for the key index on which row the name was found
            $array_key= array_search($check_agency_name, $all_validation_names);

            //Now check if the account corresponds to the right account name
            if (in_array($check_account_number,$all_validation_accounts["$array_key"]))
            //NOTE: i've even tried strict comparison using third parameter true    
            {
            //Bounce Them If the Account Matches with a name So theres no duplicate entry (works)
            }

            //If the account doesn't correspond to the right account name, enter the information
            else
            //ALSO DOESNT WORK: if (!(in_array($check_account_number,$all_validation_accounts["$array_key"])))
            {
            // The account doesn't exist for the name, so enter the information
            //CODE TO ENTER INFORMATION THEN BOUNCE (works)
            break;  
            }
        }

输出:

  

传递名称以匹配:a和帐户:1

     

存在帐户,因此所有验证数组都是:   all_validation_names:Array(       [0] =>一个       [1] =>一个       [2] => b   )

     

所有验证帐户:数组   (       [0] => 1       [1] => 2       [2] => 2   )

     

系统在数组all_validation_names中找到check_agency_name,   所以我们用这把钥匙检查帐号:0

     

帐户名称已存在,但系统未找到该帐户   数字匹配,因此必须输入该帐户,就像帐户永远不存在一样

     

表示应输入的信息:used_selector:0   agency_name:地址:city:state:zip:account_number:1

     

现在系统应该输入信息,然后退出客户端

3 个答案:

答案 0 :(得分:1)

这不是答案。您的代码充满冗余,极难阅读。在你来寻求帮助之前,你需要自己做更多的工作来缩小问题范围。任何人都不会耐心地逐步完成您的代码,特别是因为如果没有隐藏数据库的副本,他们也无法运行它。

但是,我觉得有义务告诉你,你的__trim()功能名称很差太复杂了。它不是“修剪器”,因为它与真实的trim()不同,它从字符串的“内部”和末端中删除字符。而你的实施过于复杂。

与这个单行函数相同:

function __trim($str, $charlist=" \t\r\n\0\x0B") {
    return str_replace(str_split($charlist), '', $str);
}

一旦我看到那个四十行__trim函数,我就失去了阅读问题中更多代码的意愿。

更新

你已经缩小了你的问题,很好。我将尝试在此时推断程序的状态。 (这是你应该为我们做的事情......)

将代码减至最小:

if (in_array($check_agency_name, $all_validation_names)) { 
    $array_key = array_search($check_agency_name, $all_validation_names);
    if (in_array($check_account_number, $all_validation_accounts["$array_key"])) {
        error_log('IF-BRANCH');
    } else {
        error_log('ELSE-BRANCH');
        // break;  // Removed because it makes no sense here.
    }
}

让我们看看这些变量的价值是什么:

$check_agency_name = 'a'
$all_validation_accounts = array(1, 2, 2);
$all_validation_names = array('a', 'a', 'b');
$array_key = "0";
$check_account_number = ???

您还没有告诉我们$check_account_number是什么。但是我们仍然知道至少有一件事是错的。以下行都是相同的(只是用值替换变量名称):

in_array($check_account_number, $all_validation_accounts["$array_key"])
in_array($check_account_number, $all_validation_accounts["0"])
in_array($check_account_number, $all_validation_accounts[0])
in_array($check_account_number, 1)

我们在此处看到,无论$check_account_number的值如何,in_array()都会返回false,因为其第二个参数 不是数组 !< / p>

(顺便说一下,不要引用键查找:$all_validation_accounts[$array_key]更直接 - 引用除了模糊你的意图外什么都不做。)

此代码也会产生错误Warning: in_array() expects parameter 2 to be array, integer given in /file/name.php on line ##。这会立即指出您的问题,如果您检查了错误日志,就会看到它。将PHP错误报告设置得非常高(E_ALL | E_STRICT),查看错误日志,并确保程序在正常运行时不会产生任何错误输出。如果您看到任何内容,请修复您的代码。

答案 1 :(得分:0)

警告:这不是问题的答案

让我们从类固醇的修剪开始:

使用内置的php函数更好地优化它,如下所示:

function __trim($str, $charlist = '') {
     $result = '';
     /* list of forbidden chars to be trimmed */
     $forbidden_list = array(" ", "\t", "\r", "\n", "\0", "\x0B");

     if (empty($charlist)) {
         for ($i = 0; $i < strlen($str); $i++){ 
             if(!in_array($str[$i],$forbidden_list))$result .= $str[$i];
         }
     } else {           // else means in case if (condition) was not met
         for ($i = 0; $i < strlen($str); $i++) {
             if(strpos($charlist, $str[$i])===false)$result .= $str[$i]; 
         }
     }
     return ($result);
 }

仪式讲座

停止使用mysql。 已弃用。使用它意味着引发麻烦。

答案 2 :(得分:0)

我通过重新思考支票背后的逻辑来回答我自己的问题 感谢您的所有回复。

以下是解决方案的链接。我已经在网上发布了它以进行分享以及优化,因为SO的所有伟大思想都应该得到它!

https://stackoverflow.com/questions/15775444/entry-of-items-checking-sharing-optimization-from-post-form