Transforma secunde in H:M:S (Ore, Minute, Secunde)

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Pigmy
Mesaje:11

Transforma secunde in H:M:S (Ore, Minute, Secunde)

Cod: Selectaţi tot

<?php
function Sec2Time($time)
{
    if(is_numeric($time))
    {
        $value = array(
                "hours" => 0,
                "minutes" => 0,
                "seconds" => 0,
                    );
    if($time >= 3600)
    {
        $value["hours"] = floor($time/3600);
        $time = ($time%3600);
    }

    if($time >= 60)
    {
        $value["minutes"] = floor($time/60);
        $time = ($time%60);
    }

        $value["seconds"] = floor($time);
        return (array) $value;
        }else{
        return (bool) FALSE;
    }
}
?>
Bun, tot am incercat sa modific acest cod, incat sa fac ceva de genul:

Cod: Selectaţi tot

$timp = Transformare($row['timp']);
print("<td>$timp</td>"); 
Pe web in loc sa-mi apara 3660 secunde sa-mi apara: 1:01:00
Aveti idee cum sa fac? Am mai gasit un script de genu, dar nu transforma si in secunde, si as vrea sa inteleg si eu TRANSFORMAREA asta :(

MarPlo Mesaje:4343
Salut
Acea functie, Sec2Time(), returneaza un Array cu 3 element, pt. Ora, Minute, Secunde; fiecare retinut intr-un element.
Ca sa intelegi, vezi exemplu de mai jos si explicatiile din el:

Cod: Selectaţi tot

<?php
// transoma secunde in Ore, Minute, Secunde (returnate intr-un Array)
function secToTime($time){
  // daca parametru e un numar
  if(is_numeric($time)){
    // defineste Array-ul cu elementele ce vor fi returnate
    $arr_mhs = array( 'hours'=>0, 'minutes'=>0, 'seconds'=>0 );

    // daca $time e mai mare sau egal cu o ora (3600 secunde)
    // preia in Array numar ore si lasa in $time restu de secunde
    if($time >= 3600){
      $arr_mhs['hours'] = floor($time/3600);
      $time = ($time%3600);
    }

    // daca $time e mai mare sau egal cu un minut (60 secunde)
    // preia numar minute in Array si lasa in $time restu de secunde
    if($time >= 60){
      $arr_mhs['minutes'] = floor($time/60);
      if($arr_mhs['minutes']<10) $arr_mhs['minutes'] = '0'.$arr_mhs['minutes'];    // adauga 0 inainte daca < 10
      $time = ($time%60);
    }

    // adauga in Array si secundele ramase
    $arr_mhs['seconds'] = floor($time);
    if($arr_mhs['seconds']<10) $arr_mhs['seconds'] = '0'.$arr_mhs['seconds'];    // adauga 0 inainte daca < 10

    return $arr_mhs;
  }
  else return FALSE;         // return False daca $time nu e numar
}

$timp = 3660;             // nr. secunde
$ar_timp = secToTime($timp);        // apeleaza functia ce separa Ore, Minute si secunde, si retine Array-ul returnat

// Defineste sirul ce va fi afisat, cu elementele din Array
$hms_timp = $ar_timp['hours']. ':'. $ar_timp['minutes']. ':'. $ar_timp['seconds'];
echo $hms_timp;            // 1:01:00
?>

Pigmy Mesaje:11
Da, bun...acuma inteleg cum se face, cum se transforma. Acuma vine greul, sa folosesc acest cod la baza de date.
Bun, de ce imi spune in casuta de TIMP "Array"?

Cod: Selectaţi tot

<?php

function secToTime($time)
{
	if(is_numeric($time))
	{
		$arr_mhs = array( 'hours'=>0, 'minutes'=>0, 'seconds'=>0 );

		if($time >= 3600)
		{
			$arr_mhs['hours'] = floor($time/3600);
			$time = ($time%3600);
		}

		if($time >= 60)
		{
			$arr_mhs['minutes'] = floor($time/60);
                        if($arr_mhs['minutes']<10) $arr_mhs['minutes'] = '0'.$arr_mhs['minutes'];
			$time = ($time%60);
		}

		$arr_mhs['seconds'] = floor($time);
                if($arr_mhs['seconds']<10) $arr_mhs['seconds'] = '0'.$arr_mhs['seconds'];    // adauga 0 inainte daca < 10

		return $arr_mhs;
		}else{
		return FALSE;
	}

		$HMS = $hours . ':'. $minutes . ':'. $seconds;
		return $HMS;
}

echo "<html>

while($row = mysql_fetch_array($getdata))
{
  	$timp = secToTime($row['timp']);

  	print("<td>$timp</td>");
}

echo "</html>"

?>

MarPlo Mesaje:4343
Pigmy scrie:Bun, de ce imi spune in casuta de TIMP "Array"?
Fiindca secToTime() returneaza un Array cu 3 elemente, pt. Ore, Minute, Secunde.
Este explicat in comentariile din exemplu de mai sus.
Daca nu stii cum se lucreaza cu Array si cu functii, vezi lectiile de PHP-MySQL de pe site.

Pigmy Mesaje:11
Am reusit. Acuma vine ultima intrebare legat de acest scriptulet.
Intrebarea mea este urmatoarea:
Cum pot sa fac "return" de genu:

Cod: Selectaţi tot

	$HMSTIMP = $hours . ':' . $minutes . ':' . $seconds;
	return $HMSTIMP;
El returneaza la ce am mai sus, eu vreau sa fac ceva de genu:

Cod: Selectaţi tot

	if($HMSTIMP >= 3600)
	{
		$HMSTIMP = $hours . ':' . $minutes . ':' . $seconds;
	}

	if($HMSTIMP >= 60)
	{
		$HMSTIMP = $minutes . ':' . $seconds;
	}
return $HMSTIMP;

MarPlo Mesaje:4343
Vezi urmatorul exemplu, e aceeasi functie, putin modificata. Aceasta returneaza direct un sir cu Ore:Minute:Secunde.
Varianta cu Array e buna mai ales cand iti trebuie doar o parte din aceste trei date, si le poti lua din array pe fiecare.

Cod: Selectaţi tot

<?php
// transoma secunde in Ore, Minute, Secunde (returnate intr-un Array)
function secToTime($time){
  // daca parametru e un numar
  if(is_numeric($time)){
    // defineste Array-ul cu elementele ce vor fi returnate
    $arr_mhs = array( 'hours'=>0, 'minutes'=>0, 'seconds'=>0 );

    // daca $time e mai mare sau egal cu o ora (3600 secunde)
    // preia in Array numar ore si lasa in $time restu de secunde
    if($time >= 3600){
      $arr_mhs['hours'] = floor($time/3600);
      $time = ($time%3600);
    }

    // daca $time e mai mare sau egal cu un minut (60 secunde)
    // preia numar minute in Array si lasa in $time restu de secunde
    if($time >= 60){
      $arr_mhs['minutes'] = floor($time/60);
      if($arr_mhs['minutes']<10) $arr_mhs['minutes'] = '0'.$arr_mhs['minutes'];    // adauga 0 inainte daca < 10
      $time = ($time%60);
    }

    // adauga in Array si secundele ramase
    $arr_mhs['seconds'] = floor($time);
    if($arr_mhs['seconds']<10) $arr_mhs['seconds'] = '0'.$arr_mhs['seconds'];    // adauga 0 inainte daca < 10

    return implode(':', $arr_mhs);      returneaza un sir cu Ore:Minute:Secunde
  }
  else return 'Parametru incorect, trebuie un numar de secunde';
}

$timp = 7890;             // nr. secunde
$hms_timp = secToTime($timp);        // apeleaza functia ce returneaza Ore:Minute:Secunde

echo $hms_timp;            // 2:11:30
?>
- Ca sa fie la minute 08, daca minute nu e mai mare decat 10, se poate asa:

Cod: Selectaţi tot

if($minute<10) $minute = '08'; 

Pigmy Mesaje:11
Am inteles, am reusit acuma. Mai e o nelamurire, fac un nou topic.
Multumesc inca-o data MarPlo pentru ajutor.