【问题标题】:Get stdClass Object by value按值获取 stdClass 对象
【发布时间】:2013-10-29 08:26:30
【问题描述】:

鉴于这个 stdClass 结构...

[RecentAchievements] => stdClass Object
    (
        [1446] => stdClass Object
           (
               [3319] => stdClass Object
                   (
                       [ID] => 3319
                       [GameID] => 1446
                       [Title] => Hello World!
                       [Description] => Complete World 1-1
                       [Points] => 15
                       [BadgeName] => 03909
                       [IsAwarded] => 1
                       [DateAwarded] => 2013-10-20 19:35:46
                   )

我需要检查 3319 里面的对象,比如“标题”,所以它是这样的:

$data->RecentAchievements->$gameid->ACHVIDHERE->Title;

要获取$gameid,它来自其他对象(RecentlyPlayed),这样:

[RecentlyPlayed] => Array
    (
        [0] => stdClass Object
            (
                [GameID] => 1446
                [ConsoleID] => 7
                [ConsoleName] => NES
                [Title] => Super Mario Bros
                [LastPlayed] => 2013-10-20 21:38:22
                [ImageIcon] => /Images/000385.png
                [ImageTitle] => /Images/000272.png
                [ImageIngame] => /Images/000387.png
                [ImageBoxArt] => /Images/000275.png
            )

    )

$gameid = $data3->RecentlyPlayed['0']->GameID;

API 不允许我使用相同的最近播放来获取成就 ID,我必须从最近的成就中提取它。有可能吗?

【问题讨论】:

  • 对我来说似乎不太可能在需要访问该元素时获得该 ID。您不能通过现有电话获取更多信息以获取$gameid 吗?例如要求它返回一个包含两个值的数组?
  • 您的意思是将对象转换为数组并提取ID?也许是的,但我正在寻找更干净的东西(如果可能的话)。

标签: php key stdclass


【解决方案1】:

如果您刚刚获得该特定游戏的第一个成就,则可以使用此技巧:

$firstAchievement = reset($data->RecentAchievements->$gameid);
$title = $firstAchievement->Title;

API 可能会为您提供 JSON 响应,因此您可能还需要考虑这一点:

$data = json_decode($response, true);
                               ^^^^

第二个参数true 将 JavaScript 对象转换为 PHP 数组,这在大多数情况下更容易处理它们,例如

$firstAchievement = reset($data['RecentAchievements'][$gameid]);
$title = $firstAchievement['Title'];

【讨论】:

    【解决方案2】:

    您可以使用复杂的大括号来引用对象的动态属性

    $data->RecentAchievements->{$gameid}->{$someotherid}->Title;
    

    这应该给你Hello World!,给定$gameid == 1446 和$someotherid == 3319

    【讨论】:

    • 对不起,如果我误解了你,但是如何给 $someotherid 的 ID 值(在这个特定的模型中,3319)? ACHVIDHERE 是我应该放置成就 ID 的地方,我想。所以,应该是:data->RecentAchievements->{$gameid}->{$someotherid}->Title;
    • @DanielLemes 如果ACHVIDHERE 的值为3319 和$gameid == 1446,那么您可以使用$data->RecentAchievements->{$gameid}->{ACHVIDHER}E->Title;。注意变量和常量周围的{}。
    • 是的,但这就是重点:访问 [3319] => stdClass 对象,获取值(在这个特定的对象中,3319)并将其提供给变量以创建第二部分,即调用标题。 ACHVIDHERE 只是一个占位符,我不知道如何赋予它价值。
    • 如果您不知道该值,您可以使用foreach ($object as $key => $value) 来遍历它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多