php 检查数组键是否是对象或数组[已关闭]

8dtrkrch  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(98)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
2天前关闭。
Improve this question

@if (isset($anime['genres']))
   @foreach ($anime['genres'] as $genre)
      {{ $genre['name'] . ',' }}
   @endforeach
@else
   @foreach (json_decode($anime->genres) as $genre)
      {{  $genre->name . ',' }}
   @endforeach
@endif

我有一个条件,其中**$anime['genres']是一个数组或类型为stdClass的对象。如果genres是一个数组,我想使用数组表示法检索流派名称,如果它是一个类型为stdClass的对象,则使用$genre->name。然而,当$anime['genres']**是一个对象时,我总是遇到错误“Cannot use an object of type stdClass as an array”,而不是输入“else”条件。
$anime是从这个函数返回的数据:

public function getAnimeDetail($slug)
    {
        $cachedAnimeDetail = Redis::get('anime_detail:' . $slug);
        $anime = DB::table('anime')->where('slug', $slug)->first();

        if ($cachedAnimeDetail) {
            return json_decode($cachedAnimeDetail, true);
        }
        if ($anime != null) {
            if ($anime->status != null || $anime->episode_count != null || $anime->duration != null ) {
                return $anime;
            }
        }       

        $response = Http::get('https://this-url-api/api/v1/anime/' . $slug);
        $result = $response->json();
        
        DB::table('anime')->where('slug', $slug)->update([            
            'rating' => $result['data']['rating'],
            'produser' => $result['data']['produser'],
            'type' => $result['data']['type'],
            'status' => $result['data']['status'],
            'episode_count' => $result['data']['episode_count'],
            'duration' => $result['data']['duration'],
            'release_date' => $result['data']['release_date'],
            'studio' => $result['data']['studio'],
            'genres' => $result['data']['genres'],
            'synopsis' => $result['data']['synopsis'],
            'batch' => json_encode($result['data']['batch']),                  
            'episode_lists' => json_encode($result['data']['episode_lists']),    
        ]);
        
        $result['data']['poster'] = $anime->poster;
        $result['data']['slug'] = $anime->slug;

        Redis::set('anime_detail:' . $slug, json_encode($result['data']), 'EX', 3600 * 24);
    
        return $result['data'];
    }

我尝试使用**isset $anime['genres']is_array anime['genres'],但仍然收到错误“Cannot use an object of type stdClass as an array”,而不是输入“else”条件。
如何检查正确的选项是
$anime['genres']还是$anime->genre?**因为它可以是两者,所以我需要检查它的条件。

z9smfwbn

z9smfwbn1#

你可以这样做,如果它是一个数组或对象类型的stdClass,然后访问相应的流派名称。

@if (isset($anime['genres']))
    @foreach ($anime['genres'] as $genre)
        {{ $genre['name'] . ',' }}
    @endforeach
@else
    @php
        $genres = is_array($anime->genres) ? $anime->genres : json_decode($anime->genres);
    @endphp

    @foreach ($genres as $genre)
        {{ $genre->name . ',' }}
    @endforeach
@endif

如果它是一个数组,它将被直接使用。如果它不是数组,它将使用json_decode进行转换,然后您可以使用$genre->name在流派之间进行转换。

dfty9e19

dfty9e192#

可以使用is_array()函数或is_object()函数检查任何变量的类型。
你也可以检查变量是否是特定类类型的示例。

if (isset($variable) && is_object($variable) && $variable instanceof stdClass) {
      $result = json_decode($variable, true);
   } else if (isset($variable) && is_array($variable)) {
      $result = $variable;
   } else {
      // handle invalid type
   }

在本例中,$anime可以包含'genres'数组或对象。

@if (isset($anime['genres']))
   @if (is_object($anime['genres']))
      @foreach ($anime['genres'] as $genre)
         {{ $genre->name . ',' }}
      @endforeach
   @elseif (is_array($anime['genres']))
      @foreach ($anime['genres'] as $genre)
         {{ $genre['name'] . ',' }}
      @endforeach
   @endif
@elseif(isset($anime->genres))
   @foreach (json_decode($anime->genres) as $genre)
      {{ $genre->name . ',' }}
   @endforeach
@endif

相关问题