Skracanie kodu php

0

Mam pytanie. Czy poniższy kod można bardziej skrócić, bo dopiero się uczę skracać. A tak BTW jest to funkcja pokazująca dzisiejszą datę. Wiem że mogłem to zrobić w js.

function Data()
{
    $dzien = date("d");
    $miesiac = date("m");
    $rok = date("Y");
    
    //==========================================================
    $i = array("stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia");
    $j = array(1,2,3,4,5,6,7,8,9,10,11,12);
    
    $m = 0;
    $n = false;
    //=============================================================

    do{
        switch ($miesiac) {
            case $j[$m]: {$miesiac = $i[$m]; $n = true; break;}
        }
        $m++;
    }
    while($m<12);

    if (($n == false))
        $miesiac = 'niezidentyfikowany';
        
    echo "$dzien $miesiac $rok";
}

4

No po pierwsze to tablica $j jest zupełnie niepotrzebna. Itertowanie po niej i switch również.
Zamiast

   do{
        switch ($miesiac) {
            case $j[$m]: {$miesiac = $i[$m]; $n = true; break;}
        }
        $m++;
    }
    while($m<12);

możesz zrobić

$miesiac = $i[$m + 1];

Ten if:

    if (($n == false))
        $miesiac = 'niezidentyfikowany';

również nic nie wnosi, bo nie ma opcji że date("m") zwróci Ci miesiąc inny niż 0-11.

PS: Poza tym, dla Ciebie chciałbym jeszcze dodać:

bo dopiero się uczę skracać.

Nie ma takiej czynności jak "skracanie kodu". W programowaniu, jest bardzo wiele sposobów osiągnięcia tego samego efektu, niektóre są bardziej czytelne; prostsze; bardziej intuicyjne lub po prostu krótsze niż inne. Im więcej masz doświadczenia w kodzeniu, tym z reguły instynktownie wybierasz te prostsze; i z reguły jak czytasz czyjść kod to jesteś w stanie dostrzeć że jest jeszcze inny sposób na dotarcie do celu; czasem prostszy. Z biegem czasu będziesz pisał taki kod od początku; i zobaczysz że nie ma czegoś takiego jak "umiejętność skracania kodu" :D

1

również nic nie wnosi, bo nie ma opcji że date("m") zwróci Ci miesiąc inny niż 0-11.

Z drugiej strony zauważ, że nie przekazuje bezpośrednio wywołania date("m") dalej, tylko zapisuje w zmiennej, z której korzysta później. A co za tym idzie - jest ryzyko, że gdzieś po drodze może zostać ona omyłkowo nadpisana - więc takie dodatkowe zabezpieczenie teoretycznie jest nadmiarowe, ale może w pewnych okolicznościach uratować sytuację.

10

Podczas pisania @TomRiddle już większość wyjaśnił.
Dodam od siebie drobny błąd logiczny.

    $dzien = date("d");
    $miesiac = date("m");
    $rok = date("Y");

Wywołując 3 razy funkcje date bez podania parametru, odwołujesz się do 3 różnych okresów czasu.
Co jeśli w danej mikrosekundzie zmieni się rok?
Możesz mieć sytuację typu dzień z poprzedniego roku/miesiąca i np. zmieniony już rok.
Podawaj więc jeden utworzony timestamp.

$now = time();
$dzien = date("d",$now);
$miesiac = date("m", $now);
$rok = date("Y",$now);
3

Jeżeli faktycznie chcesz sprawdzać czy masz inny miesiąc niż z zakresu 1-12 to mozna tak:

<?php
$now = time();
$miesiace = [
    '1' => 'styczen',
    '2' => 'luty',
    '3' => 'marzec',
    '4' => 'kwiecień',
    '5' => 'maj',
    '6' => 'czerwiec',
    '7' => 'lipiec',
    '8' => 'sierpień',
    '9' => 'wrzesień',
    '10' => 'październik',
    '11' => 'listopad',
    '12' => 'grudzień'
];
if (array_key_exists(date('n',$now), $miesiace)) {
    echo  date("d",$now)." ".$miesiace[date('n',$now)]." ".date("Y",$now); 
} else {
	echo  date("d",$now)." niezidentyfikowany ".date("Y",$now);
}; 

1

@TomRiddle:

również nic nie wnosi, bo nie ma opcji że date("m") zwróci Ci miesiąc inny niż 0-11.

W sumie to masz rację, ale nie czuje się pewnie z tym rozwiązaniem, bo zawsze może istnieć ryzyko że wartość może się zmienić, a bez odpowiedniego zabezpieczenia, program może się posypać. Ale w każdym razie dziękuję za pomoc.

3

Szacunek dla @jurek1980 , za wzięcie pod uwagę różnego wołania date() dla różnych czasów. Ja tego nie wziąłem pod uwagę; także brawo

Ja bym to zrobił tak:

<?php
$monthNames = ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"];

$time = time();
$day = date("d", $time);
$month = $monthNames[date('n', $time) - 1];
$year =  date("Y", $time);
echo "$day $month $year"; 
1
Michal Ksiazek napisał(a):

@TomRiddle:

również nic nie wnosi, bo nie ma opcji że date("m") zwróci Ci miesiąc inny niż 0-11.

W sumie to masz rację, ale nie czuje się pewnie z tym rozwiązaniem, bo zawsze może istnieć ryzyko że wartość może się zmienić

Nie, nie sądzę. Nie ma takiego ryzyka.

Na pewno nie "randomo", jeśli miałoby się zmienić to przy updatecie PHP z Major wersji, np z PHP7 do PHP8, ale takie informacje są publiczne dostępne. Poza tym funkcje do daty są już tak silnie zakorzenione w języku że nie ma najmniejszych szans że się zmienią.

Bardziej prawdopodobne jest że zostaną całkowicie usunięte, niż że zmienią format.

0

@TomRiddle: Ale w każdym razie dziękuję.

1
Michal Ksiazek napisał(a):

@TomRiddle: Ale w każdym razie dziękuję.

Okej, jeśli faktycznie chcesz się "zabezpieczyć" przed takim przypadkiem, to zrób to profesjonalnie:

if (array_key_exists(date('n',$now), $miesiace)) {
    echo  date("d",$now)." ".$miesiace[date('n',$now)]." ".date("Y",$now); 
} else {
    // echo  date("d",$now)." niezidentyfikowany ".date("Y",$now);  - źle, nie rob tak, to tylko wprowadziłoby użytkowników w błąd
    throw new Exception("date() method return improper values"); // rzuć wyjątek.
}; 
4

A ja dorzucę coś innego

$date = new DateTime();
$date->setTimezone(new DateTimeZone('Europe/Warsaw'));

$months = ["stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"];

echo sprintf('%1$s %2$s %3$s', $date->format('d'), $months[$date->format('n') - 1], $date->format('Y'));

Jakoś bardziej lubię DateTime() :) chociażby dlatego, że możemy sobie wykonać łatwo operację add/sub

2

Nie za bardzo kumam po co Ci tam ten switch i do while, mógłbyś to wyciągnąć po prostu po indexie.

$miesiąc = $i[$miesiąc - 1]

Poza tym do operowania na datach najlepiej użyć porządnej biblioteki np. https://carbon.nesbot.com/docs/ i wtedy jak chcesz mieć nazwę miesiąca słownie i po polsku to robisz coś takiego:

$date = Carbon::now()->locale('pl')->isoFormat('Y MMMM DD');

echo $date;

1 użytkowników online, w tym zalogowanych: 0, gości: 1