我有一个第三方包方法,可以像这样向自定义屏幕键盘添加行:
$keyboard = InlineKeyboardMarkup::make();
$keyboard->addRow(
InlineKeyboardButton::make('Button 1', callback_data: '1'),
InlineKeyboardButton::make('Button 2', callback_data: '2')
);
我有一个字母数组,我试图在屏幕键盘上创建按钮,但也不希望每行只有一个字母,所以这是我尝试的:
$letters; // ['a', 'b', 'd' ...]
$rowItems = 5;
$currentItem = 0;
$buttons = [];
for ($i = 0; $i < count($letters); $i++) {
if ($currentItem === $rowItems || $i === (count($letters) - 1)) {
$keyboard->addRow((object)$buttons);
$buttons = [];
$currentItem = 0;
} else {
$buttons[] = InlineKeyboardButton::make($letters[$i], callback_data: $letters[$i]);
$currentItem++;
}
}
这会失败,因为它说在InlineKeyboardButton对象中找不到预期的属性。如何使addRow()的内容与上面的第一个示例相同,但动态地基于不同的输入?
2条答案
按热度按时间yfwxisqw1#
你有两个问题:
$keyboard->addRow((object)$buttons);
你也可以跳过检查“我们结束了吗?”条件,并将其替换为“是否还有剩余?”“检查以下循环。
此外,除非你绝对确定你需要一个
for()
循环,否则至少可以用更少的样板文件来工作,如果不能避免像非顺序或非数字数组这样的问题的话。$x == $some_bound
仅在$x
按预期增加时才有效。检查$x >= $some_bound
可确保在$x
执行意外操作时不会意外地出现无限循环。合并为代码:
nwlls2ji2#
我建议你使用PHP的关联数组功能。因为你需要两个参数,这应该很好。
我设法找到了您正在使用的telegram-bot类,因此我有理由相信这段代码将为您工作。
您的配置数组将采用以下形式:
然后可以使用array_map处理数组并构建按钮数组。lambda(匿名函数)将创建一个键盘按钮对象数组,并将其传递给keyboard类的addRow方法,为您提出的问题提供解决方案。
这与sammitch的答案类似,只是使用了array_map和lambda。