PHP Cannot use assign-op operators with string offsets | Illegal string offset

描述PHP Cannot use assign-op operators with string offsets | Illegal string offset

PHP5.4中一个需要注意的变化(Chained string offsets) , 这个坑容易被踩到;
描述:当对于一个变量 n a m e , 如 果 name, 如果 name,name是一个字符串, 那么, 对于非数字型索引, 比如 n a m e [ ′ a g e ′ ] , 在 i s s e t 的 时 候 将 返 回 f a l s e , e m p t y 返 回 t r u e , 但 是 为 了 兼 容 已 有 的 代 码 , 当 你 获 取 这 个 值 的 时 候 , 还 是 会 返 回 name['age'], 在isset的时候将返回false, empty返回true, 但是为了兼容已有的代码, 当你获取这个值的时候, 还是会返回 name[age],issetfalse,emptytrue,,,name[0], 不过会额外抛出一个警告信息.

$name = "leyangjun";
var_dump($name["age"]);
//输出:string(1) "l"  -->(同时会有个警告(非法字符串偏移量):Warning: Illegal string offset 'age' in /usercode/file.php on line 3)


//而键值是bool, double, null的情况, 将会和以前保持一致, 不过会抛出一个Notice信息.
var_dump(isset($name["age"]));//输出:false
var_dump(empty($name["age"]));//输出:true

项目实际例子

if (!empty($polymerizeData)) {
    foreach ($polymerizeData as $rKey => $rVal) {
        foreach ($rVal as $iKey => $iVal) {
            $ret[$rKey]['submit_date'] = date('Y-m', time()));
            $ret[$rKey]['wx_amount'] += $iVal['wx_amount'] / 100;
            $ret[$rKey]['alipay_amount'] += $iVal['alipay_amount'] / 100;

			//$iVal['google_play_amount'],存储的是个json
            $googlePlayAmount = json_decode($iVal['google_play_amount'], true);
            if (!empty($googlePlayAmount)) {
                foreach ($googlePlayAmount as $gKey => $gVal) {
                    //此处:会抛出一个waring -->{\"code\":0,\"message\":\"Cannot use assign-op operators with string offsets\",\"file\":\"\\/leyangjun\\/Applications\\/leyangjun.php\",\"line\":67"}
                    $ret[$rKey]['google_play_amount'][$gKey] += $gVal;
            }
        }
    }
}

解决办法,对数据类型做下初始化即可

if (!empty($polymerizeData)) {
    foreach ($polymerizeData as $rKey => $rVal) {
        foreach ($rVal as $iKey => $iVal) {
			$ret[$rKey]['google_play_amount'] = isset($ret[$rKey]['google_play_amount']) ? $ret[$rKey]['google_play_amount'] : [];//初始化默认值
            $ret[$rKey]['submit_date'] = date('Y-m', time()));
            $ret[$rKey]['wx_amount'] += $iVal['wx_amount'] / 100;
            $ret[$rKey]['alipay_amount'] += $iVal['alipay_amount'] / 100;

			//$iVal['google_play_amount'],存储的是个json
            $googlePlayAmount = json_decode($iVal['google_play_amount'], true);
            if (!empty($googlePlayAmount)) {
                foreach ($googlePlayAmount as $gKey => $gVal) {
                    $ret[$rKey]['google_play_amount'][$gKey] = (isset($ret[$rKey]['google_play_amount'][$gKey]) ? $ret[$rKey]['google_play_amount'][$gKey] : 0) +$gVal;
            } 
        }
    }
}

总结

由于PHP是个弱类型语言,在写代码逻辑时最好都做下严谨判断

你可能感兴趣的:(PHP)