PHP变量意外结果


PHP variable unexpected result

我有以下代码:

include_once("../content/includes/connect.php");
include_once("_functions.php");
//TODO: support sending variables
$check = true;
$callback = "error";
foreach ($_GET as $key => $value) {
    echo "Key: {$key}<br>";
    echo "Value: {$value}<br>";
    echo "<pre>";
    print_r(checkRules("register", $key, $value));
    echo "</pre>";
    list($pass, $errormessage) = checkRules("register", $key, $value);
    echo "Pass: {$pass}<br>";
    echo "Errormessage: {$errormessage}<br><br>";
    if (!$pass) {
        $check = false;
        $callback = "error";
        break;
    }
}
if ($check) {
    $callback = "register_success";
}
echo json_encode(array(
    "callback" => $callback
));
SQL::close();

这给了我以下HTML页面:

Key: email
Value: a@a.aa
Array
(
    [pass] => 1
    [errormessage] => 
)
Pass:
Errormessage:
{"callback":"error"}

现在我不明白为什么list($pass, $errormessage) = checkRules("register", $key, $value);不起作用,当我清楚地看到print_r()有结果时。

list(...) = array赋值仅在数组被索引时有效,但checkRules返回关联数组。

你需要写:

$result = checkRules("register", $key, $value);
$pass = $result['pass'];
$errormessage = $result['errormessage'];

或者更改checkRules以返回索引数组(不是我的偏好——索引数组应仅用于统一数据)。

你也可以写:

list($pass, $errormessage) = array_values(checkRules("register", $key, $value));

但我认为依赖于关联数组中元素的顺序通常是不好的做法。

您返回的是一个带有字符串键的数组。您需要返回一个带有数字索引的数组,正如list所期望的那样。

checkRules应该返回[1, ""]而不是array("pass" => 1, "errormessage" => "")

像这样更改行:

list($pass, $errormessage) = array_values(checkRules("register", $key, $value));

list无法与关联数组一起工作:)