我最近升级到PHP 7.2,并且我一直在为笨拙的记录保存系统运行一些旧的旧版代码。基本上,它包含一个race_id数组和每个竞赛的条目。
/*
@Use: Adds entries into the active contest for a given member.
@Param: $user_id - INT
@Param: $entries - INT
*/
function add_vip_entries($user_id, $entries) {
$user_data = get_user_meta( $user_id, 'all_contests', true );
$contest_id = get_active_contest();
if ($contest_id !== 0) {
if (isset($user_data['all_contests'][$contest_id]['entries'])) {
$user_data['all_contests'][$contest_id]['entries'] = intval($user_data['all_contests'][$contest_id]['entries'] + $entries);
} else {
$user_data['all_contests'][$contest_id]['entries'] = $entries;
}
update_user_meta( $user_id, 'all_contests', $user_data );
}
}
这曾经很好用,但是现在,如果这是用户第一次获得给定竞赛的条目,我会收到以下错误。
并且在此确切的行上触发:
$user_data['all_contests'][$contest_id]['entries'] = $entries;
如何复制它在PHP7.0中的行为?它过去只是简单地推送创建数据结构,或者如果它是全新的比赛,则推送新的比赛ID和条目集。现在它出错了。我试图编辑成这个
$user_data = array('all_contests' => array($contest_id => array('entries' => $entries)));
但是这会导致一个问题,如果引入了新的比赛ID,它将设置数据结构以仅包含所设置的比赛ID和参赛对。
也许$ user_data = array('all_contests'=> array($ contest_id));
这里的问题是,除非您只是尝试使用$myString[n]
返回字符串的第N个字符,否则无法使用ARRAY键成功使用STRING变量。
复制:
$x = 'hello'
echo $x[1]; // returns 'e', i.e. the 1st char (0 based) of 'hello'
$x[4] = 'x';
echo $x; // returns 'hellx';
$x['my_key'] = 5; // Error illegal string offset
即您可以使用数组键访问字符串的字符(即string offset,但仅允许您使用字符串长度内的有效偏移量。不能在字符串上使用随机键变量已初始化为字符串。
您需要始终使get_user_data
返回一个数组。如果为空,则返回[]
。
$user_data = get_user_meta( $user_id, 'all_contests', true ) ?: [];