PHP 7 - IF 语句在尝试检测 $_SESSION 数组中的 KEYS 时似乎不起作用

PHP 7 - IF statements doesn't seem to work while trying to detect KEYS in $_SESSION arrays

[PHP 7.1]

下面你可以看到我的 PHP 代码。我的问题来自于我难以理解为什么第二个 IF 语句不适用于数组 $_SESSION['items'],但适用于测试数组 $zoo(我刚刚创建 $zoo 来进行测试$_SESSION['items']).

我有一个 AJAX 脚本,可以将 POST 数据发送到 PHP 代码,然后将响应记录到浏览器控制台,以便我查看结果。我的测试一切正常,对其他阵列所做的所有更改都得到了很好的结果,我无法理解和解决的唯一问题,即使在网上广泛搜索了一些线索并尝试了不同的东西之后,也是神秘的方式$_SESSION 数组似乎不喜欢将其键暴露给潜伏的 IF 语句......我来到这里试图检测数组中是否存在键以增加其值。我之前已经用其他不是 $_SESSION 数组的数组做了一些事情,它工作得很好。

session_start();

$_SESSION['items'] = array();
$zoo['animals'] = array('tiger'=>2,'lion'=>3);

if(isset($_POST['item_name'])) {
    if (isset($_SESSION['items'][$_POST['item_name']]) || array_key_exists($_POST['item_name'], $_SESSION['items'])) {
        $_SESSION['items'][$_POST['item_name']]['qnt']++;

    } else {
        $_SESSION['item_name'][$_POST['item_name']] = array('model'=>$_POST['item_model'], 'qnt'=>1);

    }

    echo json_encode($_SESSION['items']);

    exit();
  }

这是您的代码的简化版本,仅包含重要内容

 session_start();

 $_SESSION['items'] = array(); //items is now emtpy

 if (isset($_SESSION['items'][$_POST['item_name']]) || array_key_exists($_POST['item_name'], $_SESSION['items'])) {

 }

这应该更容易看清,所以这只是因为 items 是一个空数组。在条件之前按原样分配它。

要修复它,请删除此行:

$_SESSION['items'] = array();

或者更好:

$_SESSION['items'] = isset($_SESSION['items']) ? $_SESSION['items'] : [];

甚至

if(!isset($_SESSION['items'])) $_SESSION['items'] = [];

这取决于您如何修复它,但我确定您不想将其重置为空数组。这是一个很容易犯的错误,而且很难发现,因为它在技术上是合法的 PHP 代码。经过多年的编码,我现在脑子里只有一个内置的调试器……大声笑……大多数时候我都能在脑海中想象出某些东西将如何执行。

干杯!

如@artisticphoenix 所述 -

session_start();

// Check to see if there is a session variable before clearing it
// You only want to initialize it once
if (!isset($_SESSION['items'])) {
        $_SESSION['items'] = [];
}
$zoo['animals'] = array('tiger'=>2,'lion'=>3);

if(isset($_POST['item_name'])) {
        // This test is sufficient to check if the session variable has been set
        if (isset($_SESSION['items'][$_POST['item_name']])) {
                $_SESSION['items'][$_POST['item_name']]['qnt']++;
        } else {
                $_SESSION['items'][$_POST['item_name']] = array('model'=>$_POST['item_model'], 'qnt'=>1);

        }

        echo json_encode($_SESSION['items']);

        exit();
}

$_SESSION['item_name'] 应该是 $_SESSION['items']