Un tableau des jours, tout comme il faut.

Un tableau des jours, tout comme il faut.

Bonjour Monsieur j’aurais besoin d’une fonction qui me retourne un tableau $days contenant les jours de la semaine s’il vous plait.

Mais bien entendu Monsieur, voici :

function baw_get_days() {
    $days = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ];
    return $days;
}
/*
array(7) {
[0]=>
string(6) "Sunday"
[1]=>
string(6) "Monday"
[2]=>
string(7) "Tuesday"
[3]=>
string(9) "Wednesday"
[4]=>
string(8) "Thursday"
[5]=>
string(6) "Friday"
[6]=>
string(8) "Saturday"
}
*/

Alors oui, mais c’est pour un plugin donc ça doit être traduisible. Mon interface est en français.

Pas de soucis :

function baw_get_days() {
    $days = [ __( 'Sunday' ), __( 'Monday' ), __( 'Tuesday' ), __( 'Wednesday' ), __( 'Thursday' ), __( 'Friday' ), __( 'Saturday' ) ];
    return $days;
}
/*array(7) {
[0]=>
string(6) "dimanche"
[1]=>
string(6) "lundi"
[2]=>
string(7) "mardi"
[3]=>
string(9) "mercredi"
[4]=>
string(8) "jeudi"
[5]=>
string(6) "vendredi"
[6]=>
string(8) "samedi"
}
*/

Ha oui c’est tout de suite mieux, mais j’ai dit, je suis français et donc ma semaine commence par un lundi (et j’utilise les degrès Celcius et le système métrique, oui ça ne sert pas dans l’équation mais j’avais envie de le rappeler).

En même temps, remettez-moi les premières lettres en majuscule sur les jours, on les a perdues !

Ok, alors comme ceci :

function baw_get_days() {
    $days = [];
    for( $i = 0; $i < 7; $i++ ) {
        $days[] = date_i18n( 'l', strtotime( $i - date( 'w', 0 ) . ' day', 0 ) );
    }
    if ( 'Monday' === _x( 'Monday', 'First day of week, do not translate', '2112' ) ) {
        $sunday = array_shift( $days );
        $days   = array_map( 'ucfirst', array_merge( $days, [ $sunday ] ) );
    }
    return $days;
}
/*array(7) {
[0]=>
string(6) "lundi"
[1]=>
string(7) "mardi"
[2]=>
string(9) "mercredi"
[3]=>
string(8) "jeudi"
[4]=>
string(6) "vendredi"
[5]=>
string(8) "samedi"
[6]=>
string(6) "dimanche"
}
*/

Bien vu le date_i18n() ! Par contre un peu tricky avec la méthode de trad, WordPress a déjà fait ça une fois dans le core, mais comme ça force de nouveau chaque langue à intervenir pour faire son choix du lundi ou pas, je préfère éviter.
En fait le premier jour de la semaine doit être celui choisi dans les réglages généraux de WordPress. J’ai mis “mercredi” pour tester.

Oui, alors comme ça :

function baw_get_days() {
    $days = [];
    for( $i = 0; $i < 7; $i++ ) {
        $days[] = date_i18n( 'l', strtotime( $i - date( 'w', 0 ) . ' day', 0 ) );
    }
    $start_of_week = (int) get_option( 'start_of_week' ); 
    $days_before   = array_slice( $days, 0, $start_of_week ); 
    $days_after    = array_slice( $days, $start_of_week, 6 ); 
    $days          = array_map( 'ucfirst', array_merge( $days_after, $days_before ) ); 
    return $days;
}
/*
array(7) {
[0]=>
string(9) "Mercredi"
[1]=>
string(8) "Jeudi"
[2]=>
string(6) "Vendredi"
[3]=>
string(8) "Samedi"
[4]=>
string(6) "Dimanche"
[5]=>
string(6) "Lundi"
[6]=>
string(7) "Mardi"
}
*/

Pas mal le array_slice() pour découper/coller ! Mais je remarque une chose… Les clés associatives du tableau commencent toujours par 0 alors qu’elles doivent toujours rester les mêmes pour les jours, donc 0 pour le dimanche, 1 pour lundi etc. Même si le tableau commence par un autre jour.

D’accord, voici :

function baw_get_days() {
    $days = [];
    for( $i = 0; $i < 7; $i++ ) {
        $days[] = date_i18n( 'l', strtotime( $i - date( 'w', 0 ) . ' day', 0 ) );
    }
    $start_of_week = (int) get_option( 'start_of_week' ); 
    $days_before = array_slice( $days, 0, $start_of_week ); 
    $days_after = array_slice( $days, $start_of_week, 6 ); 
    $days = array_map( 'ucfirst', array_merge( $days_after, $days_before ) ); 
    $keys = range( 0, 6 ); 
    $keys_before = array_slice( $keys, 0, $start_of_week ); 
    $keys_after = array_slice( $keys, $start_of_week, 6 ); 
    $keys = array_merge( $keys_after, $keys_before ); 
    $days = array_combine( $keys, $days ); 
    return $days;
}
/*
array(7) {
[3]=>
string(9) "Mercredi"
[4]=>
string(8) "Jeudi"
[5]=>
string(6) "Vendredi"
[6]=>
string(8) "Samedi"
[0]=>
string(6) "Dimanche"
[1]=>
string(6) "Lundi"
[2]=>
string(7) "Mardi"
}
*/

Merci, un dernier point pour le défi : pas de boucle for/foreach/while, juste des fonctions de tableaux et moins de lignes….

Ça devrait faire l’affaire :

function baw_get_days() {
    $start_of_week = (int) get_option( 'start_of_week' );
    return array_map( function() use ( $start_of_week ) { static $start_of_week; return ucfirst( date_i18n( 'l', strtotime( $start_of_week++ - date( 'w', 0 ) . ' day', 0 ) ) ); }, array_combine( array_merge(array_slice( range( 0, 6 ), $start_of_week, 7 ), array_slice( range( 0, 6 ), 0, $start_of_week ) ), range( 0, 6 ) ) );
}
/*
array(7) {
[3]=>
string(9) "Mercredi"
[4]=>
string(8) "Jeudi"
[5]=>
string(6) "Vendredi"
[6]=>
string(8) "Samedi"
[0]=>
string(6) "Dimanche"
[1]=>
string(6) "Lundi"
[2]=>
string(7) "Mardi"
}
*/

Bingo, un array_map() sur une fonction anonyme, bon, une ligne c’est pas très “clever code”, on dépile un peu quand même ?

Allez :

function baw_get_days() {
    $start_of_week = (int) get_option( 'start_of_week' );
    return array_map(
        function() use ( $start_of_week ) {
            static $start_of_week;
            return ucfirst( date_i18n( 'l', strtotime( $start_of_week++ - date( 'w', 0 ) . ' day', 0 ) ) );
        },
        array_combine(
            array_merge(
                array_slice( range( 0, 6 ), $start_of_week, 7 ),
                array_slice( range( 0, 6 ), 0, $start_of_week )
            ),
        	range( 0, 6 )
        )
    );
}

Merci Monsieur, au plaisir.

De rien, à tout à l’heure.

Image à la une Vincent van Zalinge

Vous aimez ? Partagez !


Réagir à cet article

220 caractères maximum