Avatar billede Gantzel Juniormester
12. februar 2022 - 11:57 Der er 12 kommentarer og
1 løsning

Flere datoer

Hej med jer,

Er her en venlig sjæl der kan rette dette script til, så det kan håndtere flere datoer?

<?php
  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate = "11/30/1973";
  //explode the date to get month, day and year
  $birthDate = explode("/", $birthDate);
  //get age from date or birthdate
  $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
    ? ((date("Y") - $birthDate[2]) - 1)
    : (date("Y") - $birthDate[2]));
//  echo "Age is:" . $age;
?>

Jeg er på ingen måde skrap til php, men det kunne være fint hvis det kunne håndtere 5 datoer i stedet for den ene :)

På forhånd tak :)

Hilsen Peter
Avatar billede arne_v Ekspert
12. februar 2022 - 15:08 #1
Koden processer en dato. Hvis du udfører den kode på 5 forskellige dato strenge så håndterer den 5 datoer.

Så det er reelt et spørgsmål om at fidne de 5 dataoer og eventuelt få dem separeret.
Avatar billede Gantzel Juniormester
12. februar 2022 - 15:33 #2
Men det virker ikke ved at lægge scriptet ind 2 gange med forskellige datoer.
Hvordan separerer du 5 datoer og hvordan viser jeg dem på siden?

<?php
  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate = "11/30/1973";
  $birthDate2 = "10/23/1932";
  //explode the date to get month, day and year
  $birthDate = explode("/", $birthDate);
  $birthDate2 = explode("/", $birthDate);
  //get age from date or birthdate
  $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], 
  $age2 = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
    ? ((date("Y") - $birthDate[2]) - 1)
    : (date("Y") - $birthDate[2]));
//  echo "Age is:" . $age;
//  echo "Age is:" . $age2;
?>

Der er allerede noget galt i koden nu, og mine evner er slet ikke der :(
Avatar billede erikjacobsen Ekspert
12. februar 2022 - 15:39 #3
Men nu regner den jo så forkert, så det skal du også kigge på.

Rækkefølgen af parametre til mktime kan du se her.  https://php.net/mktime  og er  efter de tre 0-er:  måned, dag, år.  Men du giver den dag, måned år.
Avatar billede Gantzel Juniormester
12. februar 2022 - 15:43 #4
Jeg ved det :)
Mine evner er slet ikke der..
Jeg har brug for en der vil ændre det for mig, så det virker med 2 eller 3 datoer, således vil jeg nærstudere koden og måske have held med at udvide den til 3 eller 5 datoer.
Avatar billede erikjacobsen Ekspert
12. februar 2022 - 16:07 #5
Prøv med noget simplere, og lær undervejs. Men her en mulighed, og jeg har også byttet om på måned og dag for dig:

<?php
  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate = "15/02/1973";
  //explode the date to get month, day and year
  $birthDate = explode("/", $birthDate);
  //get age from date or birthdate
  $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[1], $birthDate[0], $birthDate[2]))) > date("md")
    ? ((date("Y") - $birthDate[2]) - 1)
    : (date("Y") - $birthDate[2]));
  echo "Age is:" . $age ."\n";

  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate2 = "15/02/1974";
  //explode the date to get month, day and year
  $birthDate2 = explode("/", $birthDate2);
  //get age from date or birthdate
  $age2 = (date("md", date("U", mktime(0, 0, 0, $birthDate2[1], $birthDate2[0], $birthDate2[2]))) > date("md")
    ? ((date("Y") - $birthDate2[2]) - 1)
    : (date("Y") - $birthDate2[2]));
  echo "Age2 is:" . $age2 ."\n";
?>
Avatar billede Gantzel Juniormester
12. februar 2022 - 17:46 #6
Mange tak Erik,

Med fare for at virke flabet, er det her den eneste måde at forenkle det på? Bruger man ikke array eller noget andet?
Jeg ved som sagt meget lidt om PHP, min ekspertise er tilbage fra phpbb2 og 3, ikke kode, men rette og tilføje mods, samt rette lidt i den kode der er min hjemmeside nu.

Tak for hjælpen :)
Avatar billede erikjacobsen Ekspert
12. februar 2022 - 18:22 #7
Der er sikkert en million forskellige måder at gøre det på - men din formulering af spørgsmålet er ganske uklar ;)

Så hvad med en funktion?

<?php
  function CalculateAge($birthDate) {
    $birthDate = explode("/", $birthDate);
    $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[1], $birthDate[0], $birthDate[2]))) > date("md")
      ? ((date("Y") - $birthDate[2]) - 1)
      : (date("Y") - $birthDate[2]));
    echo "Age is:" . $age ."\n";
    }

  CalculateAge("15/02/1973");
  CalculateAge("15/02/1974");
?>


Og så kunne man lade funktionen returnere værdien i stedet for bare at skrive den ud.  Så mangler vi bare de 999.998 andre måder.
Avatar billede Gantzel Juniormester
12. februar 2022 - 20:36 #8
Det virker nu meget fint det andet du lavede.
Jeg studsede dog over /n i dit forslag, hvad gør den?

Den oprindelige
<?php echo "" . $age; ?>

Din version
<?php echo "" . $age ."\n"; ?>

Hvad er forskellen?
Avatar billede erikjacobsen Ekspert
12. februar 2022 - 20:42 #9
"\n" skifter linje. Det kan man så ikke lige se på en webside.
Avatar billede arne_v Ekspert
12. februar 2022 - 22:02 #10
Som så ofte er første trin til en løsning at definere problemet klart.

Hvis problemet havde lydt:

lav en funktion med input string med komma separerede fødselsdatoer i DD/MM/YYYY format og returner et array af integers med aldre

så havde opgaven været langt nemmere.
Avatar billede arne_v Ekspert
12. februar 2022 - 22:02 #11
Og kode mæssigt tænker jeg også lidt anderledes.

<?php

define('DEFAULT_FMT', 'd/m/Y');

function dob_to_age($dob, $fmt = DEFAULT_FMT) {
    $dobinfo = date_parse_from_format($fmt, $dob);
    $nowinfo = getdate();
    $age = $nowinfo['year'] - $dobinfo['year'];
    if( ($nowinfo['mon'] < $dobinfo['month']) || ($nowinfo['mon'] == $dobinfo['month'] && $nowinfo['mday'] < $dobinfo['day']) ) {
        $age--;
    }
    return $age;
}

function dob_array_to_age_array($dobarr, $fmt = DEFAULT_FMT) {
    $result = array();
    foreach($dobarr as $dob) {
        $result[] = dob_to_age($dob, $fmt);
    }
    return $result;
}

function multidob_to_age_array($multidob, $fmt = DEFAULT_FMT, $delim = ',') {
    return dob_array_to_age_Array(explode($delim, $multidob), $fmt);
}

print_r(multidob_to_age_array('11/02/2021,12/02/2021,13/02/2021'));
?>
Avatar billede Gantzel Juniormester
13. februar 2022 - 00:34 #12
Det ser avanceret ud. Hvordan kalder du så de forskellige datoer i f.eks. "jeg er x år, min ældste søn er x, min yngste søn er x og vi har været gift i x år" ??
Avatar billede arne_v Ekspert
13. februar 2022 - 01:13 #13
Igen er spørgsmålet uklart. Hvad er input? Hvad er output?

Men et eksempel:

<?php

define('DEFAULT_FMT', 'd/m/Y');

function dob_to_age($dob, $fmt = DEFAULT_FMT) {
    $dobinfo = date_parse_from_format($fmt, $dob);
    $nowinfo = getdate();
    $age = $nowinfo['year'] - $dobinfo['year'];
    if( ($nowinfo['mon'] < $dobinfo['month']) || ($nowinfo['mon'] == $dobinfo['month'] && $nowinfo['mday'] < $dobinfo['day']) ) {
        $age--;
    }
    return $age;
}

function dob_array_to_age_array($dobarr, $fmt = DEFAULT_FMT) {
    $result = array();
    foreach($dobarr as $dob) {
        $result[] = dob_to_age($dob, $fmt);
    }
    return $result;
}

function multidob_to_age_array($multidob, $fmt = DEFAULT_FMT, $delim = ',') {
    return dob_array_to_age_Array(explode($delim, $multidob), $fmt);
}

function format_age_array($dobarr, $idarr, $template,  $fmt = DEFAULT_FMT) {
    $result = array();
    $agearr = dob_array_to_age_array($dobarr, $fmt);
    for($i = 0; $i < count($agearr); $i++) {
        $result[] = sprintf($template, $idarr[$i], $agearr[$i]);   
    }
    return $result;
}

foreach(format_age_array(array('01/01/1991', '02/02/1992', '03/03/2013', '04/04/2014'), array('jeg', 'min kone', 'min søn', 'min datter'), '%s er %d år') as $line) {
    echo "$line\r\n";   
}
?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester