Laravel 5.2视图报错Cannot use object of type stdClass as array求助
解决Laravel 5.2中「Cannot use object of type stdClass as array」错误
我们基于Laravel 5.2开发学生段落考试结果展示功能时,访问页面触发错误:Cannot use object of type stdClass as array,报错视图为exams/results/para-answers.blade.php,相关代码及日志如下:
报错视图代码
<?php $options = json_decode($question->answers); $correct_answers = json_decode($question->correct_answers); $outer_index=0; ?> <div class="row"> <div class="col-md-12"> <ul class="questions-container fullwidth"> <?php foreach($options as $option) { // dd($user_answers); $cAnswer = $correct_answers[$outer_index]->answer; $uAnswer = $user_answers[$outer_index]; // dd($uAnswer); // print_r($option->options[0]); $sub_options = (array)$option->options; $optionsl2 = null; // if(isset($option->optionsl2)) // $optionsl2 = (array) $option->optionsl2; foreach($sub_options as $key => $value) $sub_options = $value; ?> <li> <div class="question"> <h3> <span class="language_l1">{!!$option->question !!}</span> </h3> </div> <div class="select-answer"> <ul class="row"> <?php $index=0; foreach($sub_options as $key1 => $value1) { $correct_answer_class = ''; if($cAnswer==$index+1) { $correct_answer_class = 'correct-answer'; } $submitted_value = ''; if($user_answers) { if($uAnswer == $index+1) { $submitted_value = 'checked'; } } ?> <li class="col-md-6 {{$correct_answer_class}} answer_radio" > <input type="radio" name="option{{$question->id.$outer_index}}" id="1radio1" {{$submitted_value}} disabled=""> </li> <?php $index++; } ?> </ul> </div> </li> <hr> <?php } ?> </ul> </div> </div>
Laravel日志内容
[2022-12-28 10:33:50] production.ERROR: Cannot use object of type stdClass as array (View:.../exams/results/para-answers.blade.php) (View: .../exams/results/para-answers.blade.php) {"userId":397,"email":"synstek@gmail.com","exception":"[object] (ErrorException(code: 0): Cannot use object of type stdClass as array (View: .../exams/results/para-answers.blade.php) (View: .../exams/results/para-answers.blade.php) at .../storage/framework/views/c537d6f89990306206a4616db41781ac8be6132d.php:15, ErrorException(code: 0): Cannot use object of type stdClass as array (View: .../exams/results/para-answers.blade.php) at .../storage/framework/views/c537d6f89990306206a4616db41781ac8be6132d.php:15, Symfony\Component\Debug\Exception\FatalThrowableError(code: 0): Cannot use object of type stdClass as array at .../storage/framework/views/c537d6f89990306206a4616db41781ac8be6132d.php:15) [stacktrace] #0 .../vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php(45): Illuminate\View\Engines\CompilerEngine->handleViewException(Object(ErrorException), 1) #1 .../vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(59): Illuminate\View\Engines\PhpEngine->evaluatePath('/home/finocoin/...', Array) #2 .../vendor/laravel/framework/src/Illuminate/View/View.php(137): Illuminate\View\Engines\CompilerEngine->get('/home/finocoin/...', Array) #3 .../vendor/laravel/framework/src/Illuminate/View/View.php(120): Illuminate\View\View->getContents() #4 .../vendor/laravel/framework/src/Illuminate/View/View.php(85): Illuminate\View\View->renderContents() #5 .../vendor/laravel/framework/src/Illuminate/Http/Response.php(42): Illuminate\View\View->render() #6 .../vendor/symfony/http-foundation/Response.php(199): Illuminate\Http\Response->setContent(Object(Illuminate\View\View)) #7 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(724): Symfony\Component\HttpFoundation\Response->__construct(Object(Illuminate\View\View)) #8 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\Routing\Router::toResponse(Object(Illuminate\Http\Request), Object(Illuminate\View\View)) #9 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\Routing\Router->prepareResponse(Object(Illuminate\Http\Request), Object(Illuminate\View\View)) #10 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #11 .../app/Http/Middleware/AccountStatus.php(50): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #12 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\AccountStatus->handle(Object(Illuminate\Http\Request), Object(Closure)) #13 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #14 .../vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(67): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #15 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure)) #16 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #17 .../vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #18 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure)) #19 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #20 .../vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #21 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure)) #22 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #23 .../vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #24 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) #25 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #26 .../vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #27 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) #28 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #29 .../vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #30 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) #31 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #32 .../vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #33 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure)) #34 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #35 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #36 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(660): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #37 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) #38 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(601): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route)) #39 .../vendor/laravel/framework/src/Illuminate/Routing/Router.php(590): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) #40 .../vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) #41 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request)) #42 .../vendor/fideloper/proxy/src/TrustProxies.php(56): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #43 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fideloper\Proxy\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure)) #44 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #45 .../vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #46 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) #47 .../vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #48 .../vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #49 .../vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #50 .../vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #51 .../public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) #52 .../index.php(20): require_once('/home/finocoin/...') #53 {main}
错误原因
json_decode()默认返回stdClass对象,但代码中却用数组下标($correct_answers[$outer_index])去访问对象,导致类型不匹配错误。
修复方案
方案1:将JSON解析为关联数组
修改json_decode的调用,添加第二个参数true,让解析结果转为关联数组:
<?php // 添加第二个参数true,将JSON转为数组 $options = json_decode($question->answers, true); $correct_answers = json_decode($question->correct_answers, true); $outer_index=0; ?>
同时修改后续访问代码,将对象属性访问改为数组键访问:
$cAnswer = $correct_answers[$outer_index]['answer'];
方案2:保持对象类型,修正访问逻辑
如果需要保持对象类型,可调整遍历方式,确保$correct_answers是对象数组,且下标对应:
// 改为带索引的遍历方式,自动同步outer_index foreach($options as $outer_index => $option) { $cAnswer = $correct_answers[$outer_index]->answer; // ... 其余代码不变 }
注:如果$correct_answers解析后是单个stdClass对象而非数组,需检查存储的JSON格式是否正确(应是数组格式,以[开头)。
额外排查建议
- 用
dd($correct_answers)输出变量,确认解析后的类型和结构 - 检查数据库中
correct_answers字段存储的JSON格式是否符合数组要求
内容的提问来源于stack exchange,提问作者Navin Singh
相关产品推荐
相关产品推荐

