【PHP Telegram Bot】Day30 - 社群按赞机器人(2):将按钮设成单选并且计数

https://ithelp.ithome.com.tw/upload/images/20211009/20132916Ylrq3V0wWd.png

阵列的特性

还记得阵列怎麽赋值吗,Day15 - 基础(4):阵列处理、JSON

我们先来复习一下,我把 a, b, c 三个键分别设定成 air, bag, cat

$array = [];
$array['a'] = 'air';
$array['b'] = 'bag';
$array['c'] = 'cat';
print_r($array);
// [a] => air
// [b] => bag
// [c] => cat

然後我再把 a 设定成 apple,air 就自动消失了

$array['a'] = 'apple';
print_r($array);
// [a] => apple
// [b] => bag
// [c] => cat

你应该想到了吧,如果把人当成键、选择的选项当成值的话

$array = [
    // 人 => 选项
];
$array['阿明'] = 'a';
$array['小美'] = 'b';
$array['昊昊'] = 'c';
print_r($array);
// [阿明] => a
// [小美] => b
// [昊昊] => c

昊昊改成选择 a,完全不需要做新增移除的动作,直接赋值就行了

$array['昊昊'] = 'a';
print_r($array);
// [阿明] => a
// [小美] => b
// [昊昊] => a

如果反过来选项当成键、人当成值的话就会变成二维阵列,而且还要做新增移除,明显麻烦了许多


处理按钮事件

先来执行程序看看按钮会回传什麽,方便用来找值在阵列的哪里
https://ithelp.ithome.com.tw/upload/images/20211009/201329165fyXUPFQgT.png
来到 processCallbackQuery(),将 $msg_id $chat_id $user_id 找出来,还有加上三个 if 来处理 data
https://ithelp.ithome.com.tw/upload/images/20211009/20132916xT7KF3mMBY.png
接着就是用刚刚学到的阵列特性,$path 则是决定资料要放的地方,因为会有很多个频道,频道里又有很多则讯息,所以就用了 $chat_id$msg_id 当作路径和档名
https://ithelp.ithome.com.tw/upload/images/20211009/20132916VYOhSAfqoU.png
突然觉得同样的东西要写三遍,这样不太对,我可是超懒的,怎麽可以写三遍呢,所以这边要改一下,把 callback_data 前面加上 channel_post
https://ithelp.ithome.com.tw/upload/images/20211009/20132916A0xRJSBZ5g.png
之後这边改一下,当啷~变成只剩一个 if
https://ithelp.ithome.com.tw/upload/images/20211009/20132916Z6SvC8669k.png


储存资料

如果档案已经存在的话,就把档案读取出来,然後用阵列的特性修改资料,最後再存回去,不然的话就新增一个阵列还有存进一个新档案

至於为何选择用 fopen,这是因为如果有两个人同时按了按钮,此时有可能会只存到一个人的资料,导致另一个人按了按钮结果资料被吃掉,详细情况可以复习一下这篇文章 Day16 - 基础(5):档案读取与写入、cURL
https://ithelp.ithome.com.tw/upload/images/20211009/20132916olxQxErYjq.png


计算按赞数量

接着要来计算同一个选项总共被选择了几次,先将初始值设成 0,然後用 foreach 把阵列里的值一个个拿出来看,如果符合条件就 +1,没有的话就加 +0,这边是利用了 PHP 自动转型的特性

最後用三元运算子整理一下,如果次数是 0 就改成空字串,不然就是在前面加一个空白
https://ithelp.ithome.com.tw/upload/images/20211009/20132916WTxPJTEOmV.png


更新按钮

别忘了更新按钮的文字,把刚刚计算的数字加上去
https://ithelp.ithome.com.tw/upload/images/20211009/201329166ijihVK6wt.png
这样就完成啦,计得重新执行程序後要重发一则讯息,因为我们把 callback_data 改了嘛
https://ithelp.ithome.com.tw/upload/images/20211009/20132916HOGkUIiL8g.png
最後的最後再考考你,如果要能够收回的话应该怎麽做呢?


完赛洒花

辛苦又充实的 30 天终於结束啦,我已经等不急每天看动画看到爽了,借的书也是一整个月都没时间翻开,终於能回到我优闲慢活的人生,真是感动

最後来套句六角学院的老话,如果做不出来的话「可以参考答案」:
https://github.com/miku3920/ironman2021_by_miku3920_bot

这只机器人我已经放上服务器 24 小时运行中,欢迎拿来使用看看,如果还有想加的功能也欢迎发 PR 或 issue


<<:  Backtrader - sizer

>>:  [C 语言笔记--Day27] 6.S081 Lab syscall: Sysinfo ( II )

[Day 03]K8s 集群中有那些元件?

Kubernetes 元件介绍 在了解K8s的功能後,我们就要来了解K8s是使用那些元件来管理容器,...

Extra09 - Storybook - 元件开发框架

随着 Component Driven 兴起,元件化变为不可逆的趋势,在元件化後的可替换性与重复利用...

Day16 补充笔记React-Controlled Component

在学习React的表单时势必先了解什么是 React的受控组件(controlled compone...

day22 热流sharedFlow

在flow那篇我们了解到flow的特性,尤其是每次collect都会创建新的实例,但在某些use c...

D3JsDay18 不让资料进坟墓,秒懂农产品分布—实际资料画地图

我们到政府开放资料平台下载这两个档案,第一个是包含各种伴手礼的经纬度资料、名称、介绍等等作为要画在地...