foreach循环中的php数组

时间:2017-06-13 19:49:50

标签: php arrays php-telegram-bot

对于我正在构建的Telegram机器人,我希望根据返回的PHP PDO记录集Telegram API docs动态返回内联按钮。

硬编码好的功能代码如下所示。 这证实有效。它返回两行按钮。第一行包含两个按钮,第二行包含两个按钮。

$reply  = "Some message to show before the buttons";
$keyb   = array('inline_keyboard' => array(
            array(
                array('text'=>'Link text', 'callback_data'=>'/command'),
                array('text'=>"Link text", 'callback_data'=>'/command')
            ),
            array(
                array('text'=>'Link text', 'callback_data'=>'/command'),
                array('text'=>'Link text', 'callback_data'=>'/command')
            )
          )
        );

$replyMarkup = json_encode($keyb);
sendMessage($chatID, $reply, $replyMarkup);

到目前为止一切顺利。 但是现在我想在给定PHP记录集的情况下动态填充这些按钮。

下面会返回所需的按钮,但我不知道如何在创建第二行的两个按钮后指定一个截止点。在下面的格式中,所有按钮最终都在一行上。即使记录集返回5个结果。

$reply  = "Some message to show before the buttons";

$i=0;
// Loop through all results to create individual buttons
foreach ($stmt as $row) 
{
    $options[] = array('text'=>urlencode($row['title']), 'callback_data'=>'/x');
    $i++;
}

$keyb           = array('inline_keyboard' => array( $options ));
$replyMarkup    = json_encode($keyb);
sendMessage($chatID, $reply, $replyMarkup);

我考虑过使用带模数运算符的if语句($ i%2 = 1),但不知道如何处理定义行的父数组()...

...
if($i%2=1)
{ 
    $options[]="array("; // <-- Setting an array as a value will obviously fail
}    
... remaining code

很高兴听到任何可能对我有帮助的想法!

感谢。

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

<?php
// DUMMY DATA
$stmt = array(
            array('title'=>'Link text1', 'callback_data'=>'/command'),
            array('title'=>"Link text2", 'callback_data'=>'/command'),
            array('title'=>'Link text3', 'callback_data'=>'/command'),
            array('title'=>'Link text4', 'callback_data'=>'/command'),
            array('title'=>'Link text5', 'callback_data'=>'/command')
      );

$i=0;
$r=1;
foreach ($stmt as $row)
{
    // here's the trick: $options[$r][]
    $options[$r][] = array('text'=>urlencode($row['title']), 'callback_data'=>'/x');
    $i++;
    if($i===2) { // if counter at row 3
        $r++; // increase row index here
        $i=0; // reset counter
    };
}

// for debugging only:
echo "<pre>";
var_dump($options);
echo "</pre>";
                                        // note the change here
$keyb           = array('inline_keyboard' => $options);
?>

@ abfackeln的版本(如果您了解德语,那么用户名是什么......)实际上更好,因为他使用模数并且不会重置计数器。

答案 1 :(得分:0)

请原谅我,我必须跳进去喊:

NOOOOOOO!

到其他答案。

PHP已经提供了一个可以将数组分解为&#34; chunks&#34;叫array_chunk()。不要使用递增和模数条件来生成密钥,请使用此函数。

代码(Demo):

$stmt = array(
            array('title'=>'Link ? text1', 'callback_data'=>'/x'),
            array('title'=>"Link & text2", 'callback_data'=>'/x'),
            array('title'=>'Link # text3', 'callback_data'=>'/x'),
            array('title'=>'Link * text4', 'callback_data'=>'/x'),
            array('title'=>'Link @ text5', 'callback_data'=>'/x')
      );

// prepare the subarrays using resultset
foreach($stmt as $row){
    $options[]=['text'=>urlencode($row['title']),'callback_data'=>'/x'];
}

// then chunk into pairs, assign key, json encode --> DONE
var_export(json_encode(['inline_keyboard'=>array_chunk($options,2)]));
//sendMessage($chatID,$reply,json_encode(['inline_keyboard'=>array_chunk($options,2)]));

输出:

{"inline_keyboard":[[[{"text":"Link+%3F+text1","callback_data":"\\/x"},{"text":"Link+%26+text2","callback_data":"\\/x"}],[{"text":"Link+%23+text3","callback_data":"\\/x"},{"text":"Link+%2A+text4","callback_data":"\\/x"}],[{"text":"Link+%40+text5","callback_data":"\\/x"}]]]}