Прохождение снежинки с помощью PHP (Discord.php)

Это мой первый пост, я много читаю здесь, поэтому, надеюсь, я не смущаюсь. Я провел много поисков по этой теме с небольшими результатами, учитывая, что я новичок в PHP, это тоже не помогает, и документация по этой теме скудна.

API Discord для PHP ограничен определенными частями данных, которые вы можете запросить. Я пытаюсь сделать следующее: получить участников, проверить, какие роли у них есть, и, если они есть, подсчитать их .

В настоящее время с помощью 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)

Как видите, снежинка сложна в плане массивов.

Я пытаюсь выполнить цикл по каждой записи массива (_5 _, _ 6 _, _ 7_ и т. Д.), А затем к ролям. Если [user] имеет идентификатор роли 123456789012345678 (например), тогда добавьте этот член в счетчик для печати, если совпадения нет, он просто проигнорирует это и перейдет к следующему. Но я не совсем уверен, с чего начать. Любая помощь или направление приветствуются, спасибо.


person Tinino    schedule 03.02.2019    source источник
comment
Начните с foreach ($json_decode as $member) { ... }, и вы найдете идентификаторы ролей в $member['roles']   -  person Wesley Murch    schedule 03.02.2019


Ответы (2)


Вы можете использовать фильтр-массив и получить только нужный вам элемент с помощью 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'];}
person dWinder    schedule 03.02.2019
comment
Я тоже собираюсь попробовать это, спасибо за ответ. Я был бы счастлив отметить это как ответ, как только приспособлю его к своему случаю использования. Несмотря на это, я думаю, что эта информация, которую вы опубликовали, будет полезна всем, кто ее прочитает позже. - person Tinino; 03.02.2019
comment
Ваше решение короче и надежнее, поэтому я отмечу это как ответ, поскольку оно сработало. Спасибо! - person Tinino; 03.02.2019
comment
Привет, dWinder, у меня есть еще один вопрос по этому поводу. Будет ли способ отобразить имена пользователей, у которых также есть эти роли? Я также пытаюсь добавить это на свой веб-сайт, однако проблема, с которой я сталкиваюсь, заключается в сравнении ключей [имя пользователя] и [роли]. P.S. здесь не просят кормить с ложечки, а просто просят указать направление, как получить другие объекты в рамках успешного совпадения. - person Tinino; 03.02.2019

Вероятно, это действительно очень плохая практика, особенно для первого поста. @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. В этом случае использования это не обязательно было вопросом синтаксического анализа массива, я мог просто проверить снежинку как строка для идентификатора, который я искал. Этот вариант использования ограничен тем, что он не обязательно будет возвращать какие-либо сведения о членах, которые имеют роль, поэтому я бы не сказал, что он полностью охватывает каждый случай использования.

person Tinino    schedule 03.02.2019