PHP中向json编码的inline_keyboard数组循环追加元素的实现方法
实现方案
你需要先把inline_keyboard的数组结构单独声明,不要直接写在json_encode返回语句中,就可以通过循环灵活追加元素了。inline_keyboard的结构规则为:外层数组每一个元素代表一行,每一行的数组内的元素代表当前行的按钮。
可自定义追加按钮的通用实现
function retIKey($text, $callback, $extraButtons = []) { // 初始化基础键盘结构,第一行默认放传入的按钮 $keyboardData = [ 'inline_keyboard' => [ [ ['text' => $text, 'callback_data' => $callback] ] ] ]; foreach ($extraButtons as $btn) { // 配置is_new_line为true则新建一行放按钮,否则追加到当前最后一行 if (!empty($btn['is_new_line'])) { $keyboardData['inline_keyboard'][] = [ ['text' => $btn['text'], 'callback_data' => $btn['callback_data']] ]; } else { $lastLine = count($keyboardData['inline_keyboard']) - 1; $keyboardData['inline_keyboard'][$lastLine][] = [ 'text' => $btn['text'], 'callback_data' => $btn['callback_data'] ]; } } return json_encode($keyboardData); }
调用示例(生成你给出的目标结构)
$appendBtns = [ ['text' => 'sql1', 'callback_data' => 'sql2', 'is_new_line' => false], ['text' => 'sql2', 'callback_data' => 'sal2', 'is_new_line' => true] ]; $result = retIKey('你的默认文本', '你的默认回调', $appendBtns);
固定规则循环的简化实现
如果你的追加按钮逻辑是固定的,不需要外部传参,可以直接把循环写在函数内部:
function retIKey($text, $callback) { $keyboardData = [ 'inline_keyboard' => [ [ ['text' => $text, 'callback_data' => $callback] ] ] ]; // 你的按钮数据源,可替换为自己的业务数据 $btnSource = [ ['text' => 'sql1', 'callback' => 'sql2'], ['text' => 'sql2', 'callback' => 'sal2'] ]; foreach ($btnSource as $index => $item) { if ($index === 0) { // 第一个追加按钮和默认按钮同处一行 $keyboardData['inline_keyboard'][0][] = [ 'text' => $item['text'], 'callback_data' => $item['callback'] ]; } else { // 后续按钮单独占一行 $keyboardData['inline_keyboard'][] = [ ['text' => $item['text'], 'callback_data' => $item['callback']] ]; } } return json_encode($keyboardData); }
内容的提问来源于stack exchange,提问作者imGoat
相关产品推荐
相关产品推荐

