unregelmässigen String elegant umformen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

unregelmässigen String elegant umformen

Beitrag von mad-manne »

Hallo liebe Code-Knacker,
ich hätte hier ein kleines Problem anzubieten, falls jemand interessiert ist :roll:

Ich versuche einen "Uptime-String" zu parsen/umzuformen, der folgendes Format hat:

Code: Alles auswählen

Dd HHh MMm SSs
Hierbei stehen die Grossbuchstaben für einen variablen Zahlenwert für jeweils die Anzahl Tage(D), Stunden(H), Minuten(M) und Sekunden(S)

Mein gewünschtes Ausgabeformat ist folgendes:

Code: Alles auswählen

D Tag(e) HHh:MMm
Das verzwickte bei der Sache sind immer die "Überläufe", wenn nämlich die Tage, Stunden oder Minuten jeweils gerade auf 0 stehen ... dann sieht der String nämlich leider so aus: Ohne die Behandlung der Sonderfälle war mein Code halbwegs schlank und funktionierte auch halbwegs, ausser eben in Sonderfällen, wo das Ergebniss dann z.B. so aussieht: 2 Tage h:17m oder 1Tag 11h:m

Meine bisherigen Versuche diese Sonderfälle abzufangen würde ich mal als EPIC FAIL :oops: bezeichnen und deshalb meine Frage ... gibt's da nicht auch was mit REGEX(mit dem ich von jeher auf Kriegsfuss stehe) oder hat jemand sonst eine einfache Idee?

Ich poste hier ganz bewusst nicht meinen Code, weil ich befürchte, dass ich zunächst einen neuen Impuls für den Lösungsansatz brauche ...

So long und danke schon mal im Voraus für euer Feedback,
Manne.

NACHTRAG: Evtl. hat ja jemand eine "schlanke" Idee, wie ich den String zunächst mit den fehlenden Werten auffüllen könnte.
Also um z.B. aus 2d 7m 17s folgendes zu machen: 2d 0h 7m 17s ODER
aus 1d 8h 46s folgendes zu machen: 1d 8h 0m 46s
Das Ergebniss liesse sich dann in ein array "explodieren", wo ich dann "geordnete" Verhältnisse habe.
(DIe fehlenden Tage am Anfang, sowie die fehlden Sekunden am Ende sind dabei eher nicht mein Problem)
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Benutzeravatar
bantu
Server-Team
Beiträge: 7311
Registriert: 25.04.2006 16:12
Wohnort: Karlsruhe

Re: unregelmässigen String elegant umformen

Beitrag von bantu »

Code: Alles auswählen

function parse($date_string)
{
    $a = array('d' => 0, 'h' => 0, 'm' => 0, /*'s' => 0,*/);

    foreach(explode(' ', $date_string) as $substr)
    {
        $char = substr($substr, -1);

        if (isset($a[$char]))
        {
            $a[$char] = (int) substr($substr, 0, -1);
        }
    }

    return sprintf('%d Tag(e) %02dh:%02dm', $a['d'], $a['h'], $a['m']);
} 

Code: Alles auswählen

echo parse("1d 2h 3m 45s") . "\n";
echo parse("1d 23h 45m 12s") . "\n";
echo parse("1d 0h 0m 0s") . "\n";
echo parse("0d 0h 0m 0s") . "\n"; 

Code: Alles auswählen

1 Tag(e) 02h:03m
1 Tag(e) 23h:45m
1 Tag(e) 00h:00m
0 Tag(e) 00h:00m
Powered by Coffee
Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Re: unregelmässigen String elegant umformen

Beitrag von mad-manne »

Hi bantu,
vielen Dank ... das ist schlank und es tut :P

Da ich das Ganze bereits innerhalb einer grösseren Funktion und dazu noch innerhalb einer "äusseren" Schleife nutze, habe ich daraus jetzt folgendes gemacht:

Code: Alles auswählen

$uptime_parts = array('d' => 0, 'h' => 0, 'm' => 0);

foreach(explode(' ', $uptime_raw) as $substr)
{
	$extract_part = substr($substr, -1);

    if (isset($uptime_parts[$extract_part]))
    {
		$uptime_parts[$extract_part] = (int) substr($substr, 0, -1);
    }
}

// $uptime zurücksetzen(wegen äusserer Schleife)
$uptime = '';
// 'D Tag(e)' nur ausgeben, wenn mind. 1 Tag uptime vorhanden!
if ($uptime_parts['d'])
{
	$uptime = ($uptime_parts['d'] == 1) ? $uptime_parts['d'] . ' Tag ' : $uptime_parts['d'] . ' Tage ';
} 
// 'HHh:MMm' anhängen ... FERTIG :-)
$uptime.= sprintf('%02dh:%02dm', $uptime_parts['h'], $uptime_parts['m']);
Nun kommen also Ergebnisse wie:
  • 03h:47m
  • 1 Tag 13h:29m
  • 17 Tage 07h:13m
Gruss und nochmal Danke,
Manne.
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Antworten

Zurück zu „Coding & Technik“