我有一个遍历数据库项的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循环让我很困惑,因为我只能看到我们正在解析的当前经/纬度或行。
因此表第1行显示了该信息,但没有方位角和距离。第2行显示了第1行中的方位角和距离,因为它需要新的纬度/经度来处理信息。
在实际遍历之前,有什么方法可以预见到foreach循环中的下一个条目吗?
有人能看到一种更好的方法吗?
我可以使用下一个功能吗? https://www.php.net/manual/en/function.next.php
会
$bearing = bearing($startingLat, $startingLong, next($passageplan->$newLatitude), $passageplan->newLongitude);
工作?
答案 0 :(得分:0)
相反,您可以在此处使用for loop
来检查数组的特定成员。例如meberofArray [i] + meberofArray [i + 1]。这样,您可以访问两个元素。
for (init counter; test counter; increment counter) {
code to be executed;
}
p.s。请注意,循环可能会超出限制范围。
答案 1 :(得分:0)
假设$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];
}
答案 2 :(得分:0)
首先,准备一个数组,其中每个条目都具有所有需要的数据。
然后遍历执行的数组
$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
...
}