Сортировать массив дней с определенной даты начала - PullRequest
0 голосов
/ 02 октября 2018

У меня есть этот массив дней в случайном порядке:

$jour_planning[] = "friday";
$jour_planning[] = "wednesday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";
$jour_planning[] = "thursday";
$jour_planning[] = "sunday";
$jour_planning[] = "saturday";

Если мы сегодня "вторник", я хотел бы иметь этот новый массив:

$jour_planning[] = "wednesday";
$jour_planning[] = "thursday";
$jour_planning[] = "friday";
$jour_planning[] = "saturday";
$jour_planning[] = "sunday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";

Как это сделать с помощью usort ()?

С уважением, Vianney

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Вы можете изменить порядок массива, используя uksort(), date() и strtotime().

function sort_week_days( $t1, $t2 ) {
        $weekdays = array( 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' );
        foreach ( $weekdays as $key => $value ) {
            $weekdays[ $key ] = date( 'w', strtotime( $value ) );
        }

        $t1_time = date( 'w', strtotime( strtolower( $t1 ) ) );
        $t2_time = date( 'w', strtotime( strtolower( $t2 ) ) );

        return array_search( $t1_time, $weekdays ) - array_search( $t2_time, $weekdays );
    }

Вам нужнопередать ваш случайный массив, как показано ниже:

usort($jour_planning, "sort_week_days");

Затем вы можете использовать свой массив в следующем коде:

$day = date('w'); // You need to change to date('w', '-1day'); get result from today.

for ($i=0; $i <= $day ; $i++) {
   array_push($jour_planning, array_shift($jour_planning));
}   
0 голосов
/ 02 октября 2018

Я бы сначала отсортировал массив (и избегал французских и английских имен :)).

Затем зациклил отсортированный массив и сохранил его в 2, отделяя массив за дни до ожидаемого (включая этот),и последующие дни.

И, наконец, объедините оба массива.

Конечно, есть лучшие способы сделать это.

$jour_planning[] = "friday";
$jour_planning[] = "wednesday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";
$jour_planning[] = "thursday";
$jour_planning[] = "sunday";
$jour_planning[] = "saturday";

$sorted_days_planning = array(1 => null, 2 => null, 3 => null, 4 => null, 5 => null, 6 => null, 7 => null);

foreach ($jour_planning as $value)
{
    $day_of_week = date('N', strtotime($value));
    $sorted_days_planning[$day_of_week] = $value;
}

$final_days_planning = array();

$day_to_start = "tuesday";
$day_found = false;
$temp_array = array();
foreach ($sorted_days_planning as $value)
{
    if (!$day_found)
    {
        $temp_array[] = $value;
        if ($day_to_start == $value)
            $day_found = true;
    }
    else
        $final_days_planning[] = $value;
}

$final_days_planning = array_merge($final_days_planning, $temp_array);

var_dump($final_days_planning);

Выводы:

array(6) {
    [0]=> string(9) "wednesday"
    [1]=> string(8) "thursday"
    [2]=> string(6) "friday"
    [3]=> string(8) "saturday"
    [4]=> string(6) "sunday"
    [5]=> string(6) "monday"
    [6]=> string(7) "tuesday"
}
0 голосов
/ 02 октября 2018

Поскольку ваш массив упорядочен случайным образом, нет другого способа правильно упорядочить его, кроме как сделать это вручную (вы не можете упорядочить массив численно или в алфавитном порядке - это можно сделать, рассчитав дни с помощью функции datetime()см. @ Cid's ответ), поэтому:

/*
$jour_planning = [];

$jour_planning[] = "friday";
$jour_planning[] = "wednesday";
$jour_planning[] = "monday";
$jour_planning[] = "tuesday";
$jour_planning[] = "thursday";
$jour_planning[] = "sunday";
$jour_planning[] = "saturday";
*/

$days = [
    0 => 'monday',
    1 => 'tuesday',
    2 => 'wednesday',
    3 => 'thursday',
    4 => 'friday',
    5 => 'saturday',
    6 => 'sunday'
];

$today = array_search(strtolower(date('l')), $days);
$tomorrow = ($today === 6) ? 0 : $today + 1;
$reordered = array_merge(array_slice($days, $tomorrow), array_slice($days, 0, $tomorrow));

print_r($reordered);

Сначала вам нужно выполнить поиск текущего дня, затем добавить 1 к индексу этого дня, и у вас будет день, который будетбыть завтраТеперь, когда у вас есть этот индекс, вы просто создаете 2 массива: первый, начиная со дня завтрашнего дня, и второй, начиная с индекса 0 до сегодняшнего дня.Затем объедините эти два массива вместе, и вы получите именно то, что хотели.

0 голосов
/ 02 октября 2018
    while (end($jour_planning) !== "tuesday") {
        array_unshift($jour_planning, array_pop($jour_planning));
    }
...