Anonymní profil michaelaw – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil michaelaw – Programujte.comAnonymní profil michaelaw – Programujte.com

 

Příspěvky odeslané z IP adresy 178.77.254.–

michaelaw
PHP › výpočet termínů akcí v určit…
1. 9. 2012   #162591

#1 michaelaw
problém je samozřejmě tady v té části:

while ($n < $ortcount) { //get start terms for all the cities
      
        foreach ($ortearray as $o) {
        $helpingstring = join(";",get_start_dates($star, $diff, $wochearray));
        $newa = explode(";", $helpingstring);
        $z = 0;
        $plus = $periode;
      
        while ($z < $an) {
        foreach ($newa as $b) {                  
         $periode1[$z] = plustime($b, $plus);        
         $z++;
         $plus = $plus+$per;
        }
        }
            
        $barray[$n] = array(0=>$o, 1=>get_start_dates($star, $diff, $wochearray), 2=>$periode1);
        $diff += $diffe; // increasing the difference(from start) after every browse
        $n++;
                     
        }
        }

ale kde.....

michaelaw
PHP › výpočet termínů akcí v určit…
1. 9. 2012   #162581

Ahoj, tvořím do CMS Joomla plugin, který bude vracet termíny nějakých událostí konaných v určitých městech. V části s výpočtem musím mít nějakou, nejspíš dost hloupou chybu, ale protože už do toho koukám vážně dlouho, nevidím jí.

Zadání od uživatele:
Začátek (start) akce v prvním městě - datum
Města: názvy měst konání odd. čárkami, může jich být nekonečně mnoho
Rozdíl: počet týdnů - rozdíl v termínech mezi jedn. městy - tj. máme např. města Praha, Plzeň, na Peahu připadá termín "start", Plzeň = start + rozdíl
Perioda: až akce proběhne postupně ve všech městech, perioda (v týdnech) určuje, za jak dlouho se bude opakovat v počátečním městě, a následně ve všech dalších. Tj. např. perioda = 20, v Praze se bude akce konat opět 20 týdnů po "startu".
Doba trvání - určená jako čísla dnů v týdnu - např. 1,2,4 - několikadenní akce (např. kurz) bude v pondělí (start), úterý a čtvrtek.
Počet vrácených termínů - kolik cyklů chci vypsat (kolikrát přičítat periodu).

a výstup asi ve stylu:
Praha:
3.9.2012, 4.9.2012, 6.9.2012
12.11.2012, 13.11.2012, 15.11.2012
Plzeň:
10.9.2012, 11.9.2012, 13.9.2012
19.11.2012, 20.11.2012, 22.11.2012

= rozdíl: 1 týden
= perioda: 10 týd.
= počet: 2
= start: 3.9.2012
. . .
Je možné vypsat pouze termíny konané v budoucnu. Pokud se zadá datum v minulosti, posune se termín o týden.

V čem je problém: někde v kódu mám chybu, takže výsl. pole vypadá takhle:
http://walterwebs.eu/
(špatně vypisuje termíny vypočítané pomocí hodnoty "rozdílu") + bude dále ještě potřeba porovnat pole s db, kde jsou uloženy svátky a pokud termín vyjde na svátek, posunout ho o týden.

testovací kód: (snad nevadí anglické komentáře)

<?php

        // some values for variables
        $start = "03.09.2012";
        $periode = "10";
        $differenz = "1";
        $dauer = "1,3,5";
        $anzahl = "3";
        $orte = "Horb, Stuttgart, Basel, Karlsruhe";

      
        $wochearray = explode(",","$dauer"); // get the weekdays numbers
        $ortearray = explode(",","$orte"); // get an array from "orte" input
        $ortcount = count($ortearray);  // count the towns in array
        $daycount = count($wochearray); //the course length in days
       
                          
        $s = strtotime($start); //getting the correct format of "start" input
      
       $from_now = time()-$s;   //allow only the dates in future
            if ($from_now>0) {
            do {
            $s = $s+650000;
            } while ((time()-$s)>0);
            }
           
       $star = StrFTime("%d.%m.%Y", $s); //human readable format 
      
              
        function tag($date) {       // find the weekday of "start" day
        $position = StrPos ($date,"(");
        $tag= substr($date, $position+1,2);
        return $tag;
        }
       
        function tagnom ($tag) {   // transfer the name of day to number - beginning with 1 - "0" is not ideal for counting
       
        if ($tag == "Mo") {
        $tagnr = 1;
        } elseif($tag == "Di") {
        $tagnr = 2;
        } elseif($tag == "Mi") {
        $tagnr = 3;
        } elseif($tag == "Do") {
        $tagnr = 4;
        } elseif($tag == "Fr") {
        $tagnr = 5;
        } elseif($tag == "Sa") {
        $tagnr = 6;
        } elseif($tag == "So") {
        $tagnr = 7;
        }
        return $tagnr;
        }
      
       //FUNCTION FOR EXCLUDING VACATIONS - STILL NEED TO BE TUNED       
      /*   function istfeiertag($date) {
        $id_connection = mysql_connect("****","******","*****");
        mysql_select_db ("d27523_joomla1", $id_connection); 
        $sta = strtotime("$date");
        $year = StrFTime("%Y", $sta);       
        $varfeier = mysql_query ("SELECT * FROM jos_feiertage WHERE A='$year'",$id_connection);
        while ($feier1 = mysql_fetch_array($varfeier)) {
         if (in_array($date, $feier1)) {
         do {
         $newdate1 = strtotime("$date+1 week");
         $newdate = StrFTime("%d.%m.%Y", $newdate1);
         } while (in_array($date, $feier1));
         } else {
        //do nothing
        $newdate = $date;
        }
        return $newdate;
        }
        } */
       
        function get_start_dates ($beg, $diff, $wochearray) {  //count the array of starting dates
        $sta = strtotime("$beg+$diff days");
        $star = StrFTime("%d.%m.%Y", $sta);
        SetLocale(LC_ALL, 'de_DE');
        $stat =  StrFTime("%d.%m.%Y (%a)", $sta);
        $stat2 =  StrFTime("%d.%m.%Y", $sta);
       
        $tg = tagnom(tag($stat));
        
         foreach ($wochearray as $w3) {        // counting the dates following immadiately after start (based on weekdays from input)
         $zk3 = $w3-$tg;
         $neco3 = strtotime("$stat2+$zk3 days");
         $terminyc[] = StrFTime("%d.%m.%Y", $neco3);
          }
          /*foreach ($terminyc as $term) {
          $terminyc[] = istfeiertag($term);
          } */ // INCLUDE ISTFEIERTAG() FUNCTION AFTER IT WORKS
          return $terminyc;                       // return array
        }       
             
        function plustime($term, $periode) {             //term + "periode" weeks 
        //$term = istfeiertag($term); - include after it works
        $temp = strtotime("$term+$periode weeks");
        SetLocale(LC_ALL, 'de_DE');
        $result = StrFTime("%d.%m.%Y", $temp);
        return $result;
        }       
        $barray = array(array(array()));
      
        /*WE WILL NOT PROBABLY USE THIS        
        function countanother($newa, $per, $an, $dau, $n) {  //count another dates form strart - based on plustime()     
        $z = 0;
        $plus = $per;
                  
        //$helpingstring = implode(";",$barray[$n][1]);
        //$newa = current($barray[$n][1]);
        //$newa = explode(";", "$helpingstring");
        
        foreach ($newa as $b) {
         while ($z < $an-1) {
         $counting_browsing = 0;      
         $abteil_j = "";                                                          // variable - break
         $abt_abt = "";                                                      // variable to separate (",")
         $counting_browsing = $counting_browsing +1 ;                                //counting foreach
          if ($counting_browsing < $dau) $abt_abt = ", ";                   //where to add ","
          if ($counting_browsing == $dau) $abteil_j = "<br />";                     //where to add break              
        $periode1[] = plustime($b, $plus) . $abt_abt . $abteil_j;  //all together
         $z++;
         $plus = $plus+$per;
        }        
        
        }
       
        return $periode1;
        }      
       */      
             
        $diffe = $differenz*7;  //differenz in days   
        $diff = 0; //we start with 0 - nothing to add to 1st date (start)
        $n = 0;
        $an = $anzahl;
       
        //barray - our main array
       
        while ($n < $ortcount) { //get start terms for all the cities
       
        foreach ($ortearray as $o) {
        $helpingstring = join(";",get_start_dates($star, $diff, $wochearray));
        $newa = explode(";", $helpingstring);
        $z = 0;
        $plus = $periode;
       
        while ($z < $an) {
        foreach ($newa as $b) {                   
         $periode1[$z] = plustime($b, $plus);         
         $z++;
         $plus = $plus+$per;
        }
        }
             
        $barray[$n] = array(0=>$o, 1=>get_start_dates($star, $diff, $wochearray), 2=>$periode1);
        $diff += $diffe; // increasing the difference(from start) after every browse
        $n++;
                      
        }
        }    
       //testing printing
        echo '<pre>';
      print_r($barray);
        
       ?>

Díky za každý nápad!

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý