PHP 7升级未捕获的异常'Error',消息为'不能将字符串偏移量用作数组'

问题描述 投票:0回答:2

我最近升级到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和参赛对。

php arrays php-7
2个回答
0
投票

也许$ user_data = array('all_contests'=> array($ contest_id));


0
投票

这里的问题是,除非您只是尝试使用$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 ) ?: [];
© www.soinside.com 2019 - 2024. All rights reserved.