PHP使用stdClass设置星期对应活动属性报错及多活动存储咨询
错误原因梳理
- 索引计算错误:循环初始$x=0时,
$activity[$x - 1]实际是取$activity[-1],属于非法索引,会直接报错。星期数对应$activity[$x],要匹配$days数组的下标需要减1,正确写法是$days[$activity[$x] - 1]。 - 未提前初始化属性结构:直接对
$day->$dayIs->activity赋值时,$day->$dayIs还未被实例化为stdClass对象,PHP不会自动创建嵌套对象,会触发告警。 - 活动存储结构不支持多值:如果直接给
activity赋值字符串,后续同天的活动会直接覆盖旧值,要存储多活动需要把activity定义为数组。 - 你提到的
Cannot use object of type stdClass as array报错,大概率是代码某处错误使用了数组语法$day[$xxx]访问对象属性,对象属性需要用->语法访问。
实现方案
不需要写switch语句做冗余判断,直接用动态属性名即可实现需求,完整代码如下:
// 初始化基础结构 $day = new stdClass(); $days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; // 提前初始化每天的对象结构,避免赋值时报错 foreach ($days as $weekDay) { $day->$weekDay = new stdClass(); $day->$weekDay->activity = []; // 用数组存储多活动 } // 处理活动数组 $activityLength = count($activity); for ($x = 0; $x < $activityLength; $x += 2) { // 异常数据过滤,避免索引越界或非法星期数 if (!isset($activity[$x], $activity[$x+1]) || $activity[$x] < 1 || $activity[$x] >7) { continue; } $currentDay = $days[$activity[$x] - 1]; // 追加活动,不会覆盖同天已有内容 $day->$currentDay->activity[] = $activity[$x+1]; }
结构使用示例
读取指定日期的所有活动
// 遍历周一的所有活动 foreach ($day->Monday->activity as $act) { echo $act . PHP_EOL; }
遍历全周所有活动
foreach ($days as $weekDay) { echo $weekDay . '的活动列表:' . PHP_EOL; foreach ($day->$weekDay->activity as $act) { echo '- ' . $act . PHP_EOL; } }
给指定日期追加新活动
// 给周三新增一个活动 $day->Wednesday->activity[] = '新的活动内容';
内容的提问来源于stack exchange,提问作者user1616338
相关产品推荐
相关产品推荐

