Jump to content

Tuvākie autobusu laiki PHP


Sunriset
 Share

Recommended Posts

Lieta tāda ,kam man vajag vienam noteiktam maršrutam 3 tuvākos laikus pēc tagadējā laika, es izveidoju scriptu ,bet viņš citreiz rāda vienādus rezūltātus, un citreiz rāda nepareizi tuvāko laiku , kas varētu būt ne tā?

 

 

<?php
$day=date("l"); //Nosaka dienu (angliski)
$pulkstenis=date("H:i:s"); //Nosaka laiku
$stundas=date("H"); //Nosaka stundas
$minutes=date("i"); //Nosaka minutes
$sekundes=date("s"); //Nosaka sekundes
$intervals5=$minutes+5; //Intervāls +5min
$intervals10=$minutes+10; //Intervāls +10min
$intervals15=$minutes+15; //Intervāls +15min
$darbad = array("22:32","22:33","22:39","22:46","23:05"); // Datu baze darba dienam
$brivd = array("22:05","22:15","22:35","24:05","12:05"); // Datu baze cilosanas dienam
$brivd2 = array("22:05","22:15","22:35","24:05","12:05"); // Datu baze pohu dienam
function closest($darbad, $number){
if($i = array_search( $number, $darbad)) return $i;
$darbad[] = $number;
sort($darbad);
$i = array_search($number, $darbad);
if($i && isset($darbad[$i+1])) return $darbad[$i+1];
return null;
}
function closest2($brivd, $number){
if($i = array_search( $number, $brivd)) return $i;
$brivd[] = $number;
sort($brivd);
$i = array_search($number, $brivd);
if($i && isset($brivd[$i+1])) return $brivd[$i+1];
return null;
}
function closest3($brivd2, $number){
if($i = array_search( $number, $brivd2)) return $i;
$brivd2[] = $number;
sort($brivd2);
$i = array_search($number, $brivd2);
if($i && isset($brivd2[$i+1])) return $brivd2[$i+1];
return null;
}


if ($day == "Monday"){
$diena = "Pirmdiena";}
if ($day == "Tuesday"){
$diena = "Otrdiena";}
if ($day == "Wednesday"){
$diena = "Trešdiena";}
if ($day == "Thursday"){
$diena = "Ceturtdiena";}
if ($day == "Friday"){
$diena = "Piektdiena";}
if ($day == "Sunday"){
$diena = "Sesdiena";}
if ($day == "Saturday"){
$diena = "Svētdiena";}
echo $diena;
echo "</BR>";
echo $pulkstenis;
if ($diena == "Pirmdiena" OR $diena == "Otrdiena" OR $diena == "Trešdiena" OR $diena == "Ceturtdiena" OR $diena == "Piektdiena"){
echo "</BR><center>";
echo closest($darbad, "$stundas:$minutes:$sekundes");
echo "</BR></center><center>";
echo closest($darbad, "$stundas:$intervals5:$sekundes");
echo "</center><center>";
echo closest($darbad, "$stundas:$intervals10:$sekundes");
echo "</center>";
}
elseif ($diena == "Sesdiena") {
echo "</BR><center>";
echo closest2($brivd, "$stundas:$minutes:$sekundes");
echo "</BR></center><center>";
echo closest2($brivd, "$stundas:$intervals5:$sekundes");
echo "</center><center>";
echo closest2($brivd, "$stundas:$intervals10:$sekundes");
echo "</center>";
}
else{
echo "</BR><center>";
echo closest3($brivd2, "$stundas:$minutes:$sekundes");
echo "</BR></center><center>";
echo closest3($brivd2, "$stundas:$intervals5:$sekundes");
echo "</center><center>";
echo closest3($brivd2, "$stundas:$intervals10:$sekundes");
echo "</center>";
}
?>

, kā arī ja pēdējais autobuss ir 24:00 un nākošais 6:00 rezūltātu izdos arī nepareizu

Labots - Sunriset
Link to comment
Share on other sites

  • 2 weeks later...

Piedodiet par dubultpostu , bet es paceļu augstāk , jo tēma bija nopeldējusi , tiešām neviens nezin , kādu variantu?

Link to comment
Share on other sites

Pats sacerēji visu šo kodu? Un tu vispār saproti, kā tā programma strādā un ko viņa dara? :D

 

Variantu zinu - domā citu algoritmu, jo šobrīd izmantotais ir nepareizs.

 

Vēlreiz izlasi šo

kā arī ja pēdējais autobuss ir 24:00 un nākošais 6:00 rezūltātu izdos arī nepareizu

un uzmanīgi paskaties uz savu skriptu...

Un kas vēl tās par +5/10/15 minūtēm?

Link to comment
Share on other sites

1) nosaki, kas par laiku ir tagad, uz kuru dienu tas attiecas - brīvdienu vai darbadienu vai ko.

 

2) pārbīdi laikus. Teiksim, tagad ir "sestdienās autobusi būs 23:01, 24:01, 01:01".

Tas jauc galvu. 01:01 un 24:01 ir jau svētdeina. Un 24:01 NELIETO - tā vietā labāk lieto 00:01, mašīnām nav pieņemts skaitīt "šodien 24:01..". vai nu šodien 00:01, vai arī rīt 00:01.

 

Pārbīdi, lai nejauc galvu. Piektdienās >= pusnakts autobusus skaiti jau kā sestdienai piederīgos.

 

3)

 

$day=date("l"); //Nosaka dienu (angliski)

if ($day == "Monday"){$diena = "Pirmdiena";}
if ($day == "Tuesday"){$diena = "Otrdiena";}
if ($day == "Wednesday"){$diena = "Trešdiena";}
if ($day == "Thursday"){$diena = "Ceturtdiena";}
if ($day == "Friday"){$diena = "Piektdiena";}
if ($day == "Sunday"){$diena = "Sesdiena";}
if ($day == "Saturday"){$diena = "Svētdiena";}
echo $diena;
..

 

Visa lielā problēma - Tu mēģini operēt ar stringiem tur, kur vajag konkrētus laikus un vienības tā vietā, lai skraidītu pa visiem iespējamajiem variantiem.

2 rindiņās šo var izteikt strukturēti:

$weekdays = array('Svētdiena','Pirmdiena','Otrdiena','Trešdiena','Ceturtdiena','Piektdiena','Sestdiena');
echo 'Šobrīd ir '.$weekdays[date('w')].'.';

 

Tas pats ar laikiem - noskaidro, cikos ir sākusies šodiena, nosaki, vai šodiena ir darbadiena un starp variantiem meklē mazākos no tiem, kuri vēl nav pagājuši. Un būs.

 

pseidokods brutālam bruteforce:

$str_begin = date("Y-m-d");
echo $str_begin;
foreach($brivd as $sl){
$time = strtotime($str_begin.' '.$sl);	

echo date('Y-m-d H:i:s',$time).' ';
if($time < date('U')){
	echo 'jau pagājis.';
} else {
	echo 'vēl tikai būs.';
}
}

 

Vismaz labāk nekā kā oriģinālā - tiešu sakritību meklēšana.

Labots - usver
  • Patīk 1
Link to comment
Share on other sites

Mazliet oftopic jautājums autoram. To datubāzi ar laikiem tu savadi pats ar roku no "Rīgas Stiksmes" saraksta, vai kautkā viltīgi slēdzies klāt RS datubāzei? Tāds skriptiņš arī interesētu, kad būs gatavs ;)

Link to comment
Share on other sites

Kad pabeigšu , izlikšu te , pagaidām ar roku ir doma rakstīt , jo vajag tikai vienam maršrutam.

Bet manuprāt ir arī metodes , kā to panākt nedublējot ar roku sarakstu , bet par to , lai runā pieredzējušie...

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...