Цикл по снежинке с PHP (Discord.php)
Это мой первый пост, я много читаю здесь, так что, надеюсь, я не буду смущаться. Я много занимался поиском по этой теме, с небольшими результатами, учитывая, что я новичок в PHP
это тоже не помогает, и документации по теме немного.
Discord API для 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)
Как видите, снежинка довольно сложна с точки зрения массивов.
То, что я пытаюсь сделать здесь, это цикл по каждой записи массива ([0]
,[1]
,[2]
и т. д.) затем на роли. Если [user]
имеет идентификатор роли 123456789012345678
(например), затем добавьте этот элемент в счетчик для печати, если совпадений нет, он просто проигнорирует это и перейдет к следующему. Но я не совсем уверен, с чего начать. Любая помощь или направление приветствуется, спасибо.
2 ответа
Вы можете использовать массив-фильтр и получить только тот элемент, который вам нужен, в массиве, а затем считать их с помощью простого 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'];}
Это, наверное, очень, очень плохая практика, особенно для первого поста. @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. В этом случае использования это не обязательно был вопрос разбора массива, я смог просто проверить снежинку как Строка для идентификатора, который я искал. Этот вариант использования ограничен тем, что он не обязательно возвращает какие-либо сведения о членах, которые играют эту роль, поэтому я бы не сказал, что он полностью охватывает каждый случай использования.