2016-09-05 12 views
0

Как я могу получить, чтобы мой цикл foreach возвращал routeTitle и связанные минуты одновременно, а не заголовок сначала и минуты после?Как вернуть цикл foreach в порядке - fb bot

Мой код:

<?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 мили n | 46 мин |

Я также попытался добавить $ messagetitles переменным в $ messageminutes так:

if($k == 'minutes'){ 
     $messageminutes .= $messagetitles.$v." min |"; 
} 

, но это работает только, если есть только один маршрут через эту автобусную остановку.

Как я могу каждый раз возвращать routeTitle с каждым из своих атрибутов минут в моем цикле?

XML FEED SAMPLE: XMLfeed

+0

Это может быть полезно, чтобы увидеть образец XML вы обрабатываете – RiggsFolly

+0

@RiggsFolly добавлен образец. – Zedkay22

ответ

0

С некоторой помощью, я был в состоянии признать, что конкатенации строк была путем, но мои переменные необходимы некоторая перестановка. Смотрите ниже для успешного выхода в правильном порядке:

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 .= " | " ; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^