未定义值的"Cannot use a scalar value as an array"



我有以下代码:

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是字符串或false,或任何标量;我能理解问题出在哪里;但警告应该只发生在最后三行,而不是全部四行。

那里还有其他奇怪的事情发生,我希望它们都有关联。这是我唯一一个设法隔离到足以提出问题的人。

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

编辑:

我注意到许多生成的字符串都有一个无关的"0"。这会破坏一些东西,比如SQL。如果空数组值以某种方式默认为"0"或其他值,这将解释很多。我不知道怎么会发生这种事。我当前正在为"register_tick_function"进行grepping。。。

您需要检查数组是否具有所需的键。类似这样的东西:

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

恐怕您的代码是错误的

这条线路

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

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

如果你这样做而不是

$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;

然后,您将获得一个子数组,其中包含所有值;

最新更新