"不能使用标量值作为数组"对于未定义的值

时间:2016-06-02 12:18:08

标签: php

我有以下代码:

function Biz_GetAccountsPerMarket($site = "", $cache = true){
    if($site == ""){
        $site = $_SESSION["sitedirect_current_site"];
    }

    $aAccounts = Sys_OptionsGet("sys_site/".$site, "account", $cache);

    $aAccountInfo   = array();
    $aVatAccount    = Biz_GetVatAccounts($site, $cache);
    $aSalesAccount  = Biz_GetSalesAccounts($site, $cache);

    foreach((array)$aAccounts as $code => $data){
        foreach((array)$data["data"] as $market => $aItem){
            $aAccountInfo[$market][$code] = $aItem;
            $aAccountInfo[$market][$code]["vat"]           = $aVatAccount[$aItem["vat_account_code"]]["value"];
            $aAccountInfo[$market][$code]["vat_account"]   = $aVatAccount[$aItem["vat_account_code"]]["account"];
            $aAccountInfo[$market][$code]["sales_account"] = $aSalesAccount[$aItem["sales_account_code"]]["account"];
        }
    }

    return $aAccountInfo;
}

嵌套循环中的四条最里面的行会生成警告:"不能将标量值用作数组"。

添加初始化$aAccountInfo[$market]$aAccountInfo[$market][$code]到空数组的行首先会使错误沉默,但这远远不是我们代码中以这种方式初始化嵌套数组的唯一地方。而且我无法弄清楚为什么它首先是一个问题。

以下代码应该重现问题;据我所知;但不是:

<?php    
ini_set('display_errors', '1');
error_reporting(E_ALL | E_STRICT);
$aTest = [];

$aTest['key']['key'] = 'sausage';

如果$aItem是字符串或假,或任何标量;我能理解问题是什么;但是警告应该只发生在最后三行,而不是全部四行。

还有其他奇怪的事情发生在那里,我希望他们全都联系在一起。这是我唯一能够孤立起来提出问题的人。

是否有可能以某种方式设置由数组访问创建的默认值?

编辑:

我注意到生成的许多字符串都有一个无关的&#34; 0&#34;。这打破了事情,比如SQL。如果空数组值以某种方式默认为&#34; 0&#34;或者什么,这可以解释很多。我不知道怎么会发生这种情况。我目前正在寻找&#34; register_tick_function&#34; ...

2 个答案:

答案 0 :(得分:0)

您需要检查数组是否具有预期的键。像这样:

$aAccountInfo[$market][$code]["vat"] = isset($aItem["vat_account_code"]) ? (isset($aVatAccount[$aItem["vat_account_code"]]) ? $aVatAccount[$aItem["vat_account_code"]]["value"] : []) : [];  

答案 1 :(得分:0)

我担心你的代码错了

这一行

$aAccountInfo[$market][$code] = $aItem;

创建包含SCALAR值的新出现,然后尝试将子数组添加到该标量值上,因此出现错误

如果你这样做

$t = array();
$t['item']          = $aItem;
$t["vat"]           = $aVatAccount[$aItem["vat_account_code"]]["value"];
$t["vat_account"]   = $aVatAccount[$aItem["vat_account_code"]]["account"];
$t["sales_account"] = $aSalesAccount[$aItem["sales_account_code"]]["account"];

$aAccountInfo[$market][$code] = $t;

然后你将得到一个包含其中所有值的子数组;