ugrás a tartalomhoz

PHP - Osztás 1. maradéka.

internet · 2011. Aug. 10. (Sze), 15.57
Hello. A következő gondom akadt PHP-ban.
Egy kutyaneveldét készítek. (Eddig sikerrel)
Szeretnék hozzádobni, egy kor mérőt, hogy a kutya hány éves.
Az adatbázisban 1 mezőben (INIT) tárolja, a napok számát amióta megvan a kutya. Ez automatikuson naponként nő 1-el.
Kiolvasom az adatbázisból.
Elkezdek vele dolgozni.
Eddig erre jutottam.

//Változók létrehozása
$korev = ""; $korevv = "";
$korhonap = ""; $korhonapv = "";
$korhet = ""; $korhetv = "";
$kornap = ""; $kornapv = "";
//matekolunk
if($kor < 7){ $kornap = $kor; $kornapv = " napos";}
if($kor >= 7){if(($kor%7)/7 == 0){$korhet = $kor/7; $korhetv = " hetes ";}else{$korhet = intval($kor/7); $korhetv = " hetes és "; $kornap = substr(($kor%7)/7,2,1); $kornapv = " napos.";} }
//Megjelenítem
print "Kora: ".$korev."".$korevv."".$korhonap."".$korhonapv."".$korhet."".$korhetv."".$kornap."".$kornapv;
A $kor változó adja meg a kutya korát amit kinyer MySql-ből.
Ha 7 nap alatt van akkor kiírja, simán h ennyi napos.
De ha 7 nap fölött van, akkor szeretném, hogy kiszámolja, hogy hány hét és úgy átalakítsa. Ha A szám maradéktalanul osztható 7-el semmi gond. De ha már nem akkor gond van.
Ebben kérném segítségeteket.
Mégegyszer az a kódrészlet:
$korhet = intval($kor/7); $korhetv = " hetes és "; $kornap = substr(($kor%7)/7,2,1); $kornapv = " napos.";} 
Üdvözlettel: T-bond
 
1

Átmenet

internet · 2011. Aug. 10. (Sze), 16.10
A következő átmeneti kóddal dolgozik most:

if($kor >= 7){if(($kor%7)/7 == 0){$korhet = $kor/7; $korhetv = " hetes ";}else{
$kornap = $kor;
while($kornap != 0)
{
if($kornap-7 >= 0){ $korhet += 1; $kornap -= 7;}else{break;}
}
$korhetv = " hetes és "; $kornapv = " napos.";}}
Remélem valaki tud jobb megoldást javasolni.
2

Kicsit formázd meg a kódot,

bugadani · 2011. Aug. 10. (Sze), 16.21
Kicsit formázd meg a kódot, meglehetősen nehezen olvasható.
Én így csinálnám:

$kor = 43; //csak a példa kedvéért
$output = array(); //ide fogjuk pakolni a megjelenítendő kor darabkáit
if($kor / 365 > 1){
    $ev = floor($kor/365);
    $output[] = $ev . ' éves';
    $kor -= $ev * 365;
}
if($kor / 7 > 1){
    $het = floor($kor/7);
    $output[] = $het . ' hetes';
    $kor -= $het * 7;
}
if($kor > 0){
    $output[] = $kor . ' napos';
}
echo 'A kutya '.implode(', ', $output).'.';
Szerkesztettem, mert bennemaradt egy vesszőhiba.
A fenti kimenete: A kutya 6 hetes, 1 napos.
3

Valami ilyesmi? <?php $kor =

Poetro · 2011. Aug. 10. (Sze), 16.22
Valami ilyesmi?

<?php
$kor = 31;
$datumok = array('éves' => 365, 'hónapos' => 30, 'hétes' => 7, 'napos' => 1);
$maradek = $kor;
$kimenet = array();
foreach ($datumok as $mertek => $nap) {
  $ertek = floor($maradek / $nap);
  if ($ertek) {
    $kimenet[] = "$ertek $mertek";
  }
  $maradek -= $ertek * $nap;
}

print implode(' és ', $kimenet);
?>
Egyébként miért a napok számát tárolod, miért nem a dátumot? Onnan a MySQL ki tudja számolni neked a napok számát a kezdő dátumtól a maiig, és nem kell naponta frissíteni minden bejegyzést.
4

Vannak problémáim azzal, amit leírtál

H.Z. v2 · 2011. Aug. 10. (Sze), 16.24
De lehet, hogy csak egyszerűen nem értelek.

Az adatbázisban 1 mezőben (INIT) tárolja, a napok számát amióta megvan a kutya. Ez automatikuson naponként nő 1-el.

Van a kutyának egy születési dátuma. Nem lenne egyszerűbb ezt tárolni az adatbázisban és minden lekérdezéskor újra kiszámolni, hogy hány napos?
Kicsit macerás nap, mint nap frissíteni a napok számát.

Hogy mennyi idős? Kb. így számolnám ki:

$hetek=int($ossznapok/7);
$napok=$ossznapok%7;
echo $hetek!=0?"$hetek hetes és $napok napos":"$napok napos";

(az int-ben nem vagyok biztos, az a függvény kell, ami lecsapja a tizedest, nem kerekít)
5

fmod()

pkadam · 2011. Aug. 11. (Cs), 03.11
Nem bonyolítjátok túl egy kicsit? Létezik egy remek fmod() nevű függvény, ami megnézi nekünk az osztás maradékát.

$age = floor((time()-strtotime('2011-07-19'))/(60*60*24));
$days = fmod($age,7);
$weeks = ($age-$days)/7;

if ($weeks) $output[] =  $weeks.' hetes';
if ($days) $output[] = $days.' napos';

echo 'A kutya ' . implode(' és ',$output) . '.';
Vagy simán lehet a $age már eleve a kor napokban (a példában 23), de mint előttem is írták, célszerűbb a születési dátumot tárolni.

(A hónapot és az évet osztogatós módszerrel semmiképp sem számolnám, mert bármely két egymást követő hónapot nézve már borul a 30 nap.)