Вернитесь во времени по циклу foreach - PullRequest
0 голосов
/ 11 июля 2019

У меня есть цикл foreach, выполняющий элементы базы данных; Цикл выводит строки таблицы с позициями путевых точек.

Я использую некоторые функции для определения направления и расстояния до следующей путевой точки.

  $startingLat = $passagePlans->first()->latitude;
  startingLong = $passagePlans->first()->longitude;

  foreach ($passagePlans->results() as $passageplan) {

  if ($i >= 1) {
  // Set the new lat/lon coordinates
  $newLatitude = $passageplan->latitude;
  $newLongitude = $passageplan->longitude;
  // Set the bearing and distance variables
  $bearing = bearing($startingLat, $startingLong, $newLatitude, $newLongitude);
  $distance = distance($startingLat, $startingLong, $newLatitude, $newLongitude);
  // Update the new starting lat/long with the last waypoint ready for the next iteration through the GPX file
  $startingLat = $newLatitude;
  $startingLong = $newLongitude;
  }
  $i++;

  echo '
  <tr>
  <td rowspan="2">'.$passageplan->waypoint_number.'</td>
  <td>'.$passageplan->waypoint_name.'</td>
                    <td>'.convertDecimalToDMSLatitude($passageplan->latitude).'</br>'.convertDecimalToDMSLongitude($passageplan->longitude).'</td>
  <td>'.$bearing.'°</td>
  <td>'.$distance.'</td>
  <td>'.$passageplan->vhf.'</td>
  <td>HW '.$passageplan->hw_height.'<sup>m</sup> at '.$passageplan->hw_time.' </br>LW '.$passageplan->lw_height.'<sup>m</sup> at '.$passageplan->lw_time.'</td>
  <td>Charts: '.$passageplan->chart_num.'<br />Almanac: '.$passageplan->almanac.'<br />Radio Signals: '.$passageplan->radio_signals.'</td>
  <td>'.$passageplan->por.'<br />Almanac: '.$passageplan->por_almanac.'<br />VHF CH: '.$passageplan->por_vhf.'</td>
  <td align="right" >
  <a href="/pages/voyages/passageplans/editwaypoint.php?voyage='.Input::get('voyage').'&plan='.Input::get('plan').'&waypoint='.$passageplan->waypoint_id.'" class="btn btn-sm btn-outline-primary">edit</a>
  <a href="/pages/voyages/passageplans/deletewaypoint.php?voyage='.Input::get('voyage').'&plan='.Input::get('plan').'&waypoint='.$passageplan->waypoint_id.'" class="btn btn-sm btn-outline-danger">delete</a>
  </td>
  </tr>
  <tr>
  <td colspan="9">
  '.$passageplan->passage_note.'
  </td>
  </tr>
  ';
  }
  ?>

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

Цикл foreach сбивает меня с толку, так как я вижу только текущий lat / long или строку, через которую мы разбираем.

Таким образом, в строке 1 таблицы показана информация, но без указания и расстояния. А в строке 2 показаны азимут и расстояние, которые должны быть в строке 1, поскольку для обработки информации требуется новый лат / длинный.

Есть ли способ заглянуть в следующую запись в цикле foreach, прежде чем перейти к ней? ?? 1012 *

Может кто-нибудь увидеть лучший способ сделать это?

Могу ли я использовать следующую функцию? https://www.php.net/manual/en/function.next.php

Будет

$bearing = bearing($startingLat, $startingLong, next($passageplan->$newLatitude), $passageplan->newLongitude);

работа ??

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Предполагая, что $passagePlans->results() возвращает нумерованный массив, вы можете использовать обычный цикл for.

$results = $passagePlans->results();

// You can't access next element when the current is the last one, so subtract -1
// to prevent going out of bounds
$end = count($results) - 1;
for($i=0; $i < $end; $i++) {
    $first = $results[0];
    $current = $results[$i];
    $next = $results[$i + 1];
}
0 голосов
/ 11 июля 2019

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

$passagePlansPrepared = array();
$i = 0;
foreach ($passagePlans->results() as $passageplan) {
    $passagePlansPrepared[$i]['plan'] = $passageplan;
    $passagePlansPrepared[$i]['latitude'] = $passageplan->latitude;
    $passagePlansPrepared[$i]['longitude'] = $passageplan->longitude;
    if ($i > 0) {
        $passagePlansPrepared[$i - 1]['latitude_2'] = $passageplan->latitude;
        $passagePlansPrepared[$i - 1]['longitude_2'] = $passageplan->longitude;  
    }
    $i++;
}

foreach ($passagePlansPrepared as $passageplan) {
    if (!isset[$passageplan['latitude_2']]) {
        continue; // skip last row
    }
    $bearing = bearing($passageplan['latitude'], $passageplan['longitude'], $passageplan['latitude_2'], $passageplan['longitude_2']);
    ...
    $passageplan['plan']->vhf
    ...              
}
0 голосов
/ 11 июля 2019

Вместо этого вы можете использовать for loop, здесь вы можете проверить конкретный член вашего массива. Например, meberofArray [i] + meberofArray [i + 1]. Таким образом, вы можете получить доступ к обоим элементам.

for (init counter; test counter; increment counter) {
    code to be executed;
}

p.s. Имейте в виду, что цикл может выйти из-под ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...