Как сделать так, чтобы мой цикл foreach возвращал routeTitle и соответствующие минуты сразу, а не имел название сначала и минуты после?
Мой код:
<?php
// parameters
$hubVerifyToken = '#######';
$accessToken = "########";
// check token at setup
if ($_REQUEST['hub_verify_token'] === $hubVerifyToken) {
echo $_REQUEST['hub_challenge'];
exit;
}
// handle bot's anwser
$input = json_decode(file_get_contents('php://input'), true);
$senderId = $input['entry'][0]['messaging'][0]['sender']['id'];
$messageText = $input['entry'][0]['messaging'][0]['message']['text'];**$stopid = $messageText;
$urlbase = "http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=ttc&stopId=";
$url = $urlbase.$stopid;
$xml = simplexml_load_file($url);
$rt = $xml->predictions;foreach ($rt as $value) {
$messagetitles .= $value->attributes()->routeTitle." arriving in ";
if(isset($value->direction)){
foreach($value->direction->prediction as $attr){
foreach($attr->attributes() as $k => $v){
if($k == 'minutes'){
$messageminutes .= $v." min |";
}
}
}
}else{
$messageminutes = "Error this bus isn't running";
}
}if($messageText == "hi") {
$answer = "Type your Stop ID for the latest times.";
}$response = [
'recipient' => [ 'id' => $senderId ],
'message' => [ 'text' => $messagetitles.$messageminutes]
];**
$ch = curl_init('https://graph.facebook.com/v2.6/me/messages?access_token='.$accessToken);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_exec($ch);
curl_close($ch);
Я попытался: объединить строки
foreach ($rt as $value) {
$messagetitles .= $value->attributes()->routeTitle." arriving in ";
if(isset($value->direction)){
foreach($value->direction->prediction as $attr){
foreach($attr->attributes() as $k => $v){
if($k == 'minutes'){
$messageminutes .= $v." min |";
}
}
}
}else{
$messageminutes = "Error this bus isn't running";
}
}
но это сначала возвращает все routeTitles, а затем время отдельно, как это:
325-Дон Миллс прибывает в 185-Дон Миллс Ракета прибывает в 25-Дон Миллз, прибывающих в Ошибка, этот автобус не работает15 минут | 39 минут | 43 минут | 46 минут |
Я также попытался добавить переменную $ messagetitles в $ messageminutes следующим образом:
if($k == 'minutes'){
$messageminutes .= $messagetitles.$v." min |";
}
но это работает только если есть только 1 маршрут через эту автобусную остановку.
Как бы я мог каждый раз возвращать routeTitle с каждым из его атрибутов минут в моем цикле?
ОБРАЗЕЦ ПОДАЧИ XML: XMLfeed
С некоторой помощью я смог распознать, что объединение строк — это путь, но мои переменные нуждались в некоторой перестройке. См. Ниже для успешного вывода в правильном порядке:
foreach ($rt as $value) {
$messagetitles = $value->attributes()->routeTitle ;
$messageminutes = "" ;
$final .= $messagetitles ;
if(isset($value->direction)){
$final .=" arriving in ";
foreach($value->direction->prediction as $attr){foreach($attr->attributes() as $k => $v){
if($k == 'minutes'){
$messageminutes .= " ".$v." min,";
}
}
}
}else{
$messageminutes = " is currently not available.";
}
$final .= $messageminutes ;
$final .= " | " ;
}
Других решений пока нет …