使用PHP(Discord.php)遍历雪花

时间:2019-02-03 08:08:44

标签: php arrays discord snowflake

这是我的第一篇文章,我在这里做了很多阅读,所以希望我避免尴尬。鉴于我是PHP的新手,因此我对该主题进行了大量搜索,但收效甚微,而且也无济于事,并且该主题的文档还很少。

PHP的Discord API限于您可以请求的某些数据,我试图做的是:获取成员,检查他们具有什么角色,以及如果他们有,算一下。

当前,使用该API可以统计公会中的所有成员,但是不能统计公会中具有特定角色的所有成员。我的最终结论是遍历雪花,亲自进行比较。

此代码返回公会的雪花(最多1000个):

<?php
    $json_options = [
      "http" => [
        "method" => "GET",
        "header" => "Authorization: Bot TOKENREDACTED"
      ]
    ];    
    $json_context = stream_context_create($json_options); 
    $json_get     = file_get_contents('https://discordapp.com/api/guilds/GUILDIDREDACTED/members?limit=1000', false, $json_context);
    $json_decode  = json_decode($json_get, true);
    print_r($json_decode);
?>

我试图环游的雪花看起来像这样:

Array
(
    [0] => Array
        (
            [nick] => nickname
            [user] => Array
                (
                    [username] => username
                    [discriminator] => 7697
                    [id] => 123456789012345
                    [avatar] => 32ad726b873445fff9145e47144a9465
                )
            [roles] => Array
                (
                    [0] => 123456789012345678
                    [1] => 123456789012345678
                )
            [mute] => 
            [deaf] => 
            [joined_at] => 2018-05-18T07:22:49.562000+00:00
        )
    [1] => Array (annnd repeat for the next member)

如您所见,雪花在数组方面非常复杂。

我要在这里做的是遍历每个数组条目([0][1][2]等),然后循环到角色。例如,如果[user]的角色ID为123456789012345678,则将该成员添加到要打印的计数中,如果不匹配,则将其忽略而移至下一个。但是我不确定从哪里开始。感谢您的帮助或指导,谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用array-filter并通过in-array仅获取所需的元素,然后使用简单的count方法对它们进行计数。请考虑以下内容:

$arr = array_filter($json_decode, function($e) {return in_array("123456789012345678", $e['roles']);});
echo count($arr);

如果您的“ RoleId”是动态的,则可以执行以下操作:

$myRole = "123456789012345678";
$arr = array_filter($json_decode, function($e) use ($myRole) {return in_array($myRole, $e['roles']);});

如果您还想显示username,则可以执行以下操作:

foreach($arr as $e) {echo $e['user']['username'];}

答案 1 :(得分:0)

这可能真的是非常糟糕的做法,尤其是对于第一篇文章。 @wesley murch非常感谢您的指导,我现在明白了。另外,请随时回复,以便我将您标记为答案。这是我想与大家共享的工作代码,并对代码的作用进行以下说明:

<?php
$json_options = [
  "http" => [
    "method" => "GET",
    "header" => "Authorization: Bot Your-Discord-Bot-Token-Here"
  ]
];

$json_context = stream_context_create($json_options);

$json_get     = file_get_contents('https://discordapp.com/api/guilds/your-guild-id-here/members?limit=1000', false, $json_context);


print_r(substr_count ( $json_get ,'Role-Id-To-Look-For'));
?>

此代码将查询雪花的API,然后将雪花转换为字符串,并计算雪花中包含该角色的次数。在这种情况下,我有12个人担任该角色,我可以确认它成功返回了值12。在这种使用情况下,不必解析数组,我可以将雪花检查为我要查找的ID的字符串。该用例的局限性在于它不一定会返回具有该角色的成员的任何详细信息,因此我不会说它完全涵盖了每个用例。