Рабочий график, дни недели

Andru

Новичок
Здравствуйте, вопрос такого характера, есть дни недели в массиве, нужно преобразовать их в строку и выкинуть те дни, которые идут между крайними днями последовательно, а вместо их поставить дефис. Например:


Массив:
PHP:
$arr  = array(0=>"Понедельник",1=>"Вторник",2=>"Среда",3=>"Четверг",4=>"Пятница",5=>"Суббота",6=>"Воскресенье");
Преобразовать в: (Понедельник-Воскресенье)


Массив:
PHP:
$arr  = array(0=>"Понедельник",1=>"Вторник",2=>"Среда",3=>"Четверг",4=>"Пятница");
Преобразовать в: (Понедельник-Пятница)

Массив:
PHP:
$arr  = array(0=>"Понедельник",1=>"Среда",2=>"Четверг",3=>"Пятница");
Преобразовать в: (Понедельник, Среда-Пятница)

Может уже есть готовые варианты.
 

antson

Новичок
Партнер клуба
@Sufir, а может усы не сбривать ?
тесты пройдет. правда можно извратнуться и придумать другие не учтенные случаи ;)
Код:
<?php
$arr = array(0 => "Понедельник", 1 => "Вторник", 2 => "Среда", 3 => "Четверг", 4 => "Пятница", 5 => "Суббота", 6 => "Воскресенье");
// $arr = array(0 => "Понедельник", 1 => "Вторник", 2 => "Среда", 3 => "Четверг", 4 => "Пятница");
// $arr = array(0 => "Понедельник", 1 => "Среда", 2 => "Четверг", 3 => "Пятница");

echo array_reduce($arr, function ($carry, $item) {
    $next = [
        "Понедельник" => "Вторник",
        "Вторник" => "Среда",
        "Среда" => "Четверг",
        "Четверг" => "Пятница",
        "Пятница" => "Суббота",
        "Суббота" => "Воскресенье",
    ];
    if (empty($carry)) {
        return $item;
    }
    if (strpos($carry, '-') > 0) {
        list($start, $end) = explode('-', $carry);
        if ($next[$end] == $item) {
            return $start . '-' . $item;
        }
    }
    if (isset($next[$carry]) && $next[$carry] == $item) {
        return $carry . '-' . $item;
    }
    if (strpos($carry, ',') > 0) {
        $prev = explode(',', $carry);
        $last = array_pop($prev);
        if ($next[$last] == $item) {
            return implode(',', $prev) . ',' . $last . '-' . $item;
        }
    }
    return $carry . ',' . $item;
}, "");
 

Andru

Новичок
@Sufir, а может усы не сбривать ?
тесты пройдет. правда можно извратнуться и придумать другие не учтенные случаи ;)
Код:
<?php
$arr = array(0 => "Понедельник", 1 => "Вторник", 2 => "Среда", 3 => "Четверг", 4 => "Пятница", 5 => "Суббота", 6 => "Воскресенье");
// $arr = array(0 => "Понедельник", 1 => "Вторник", 2 => "Среда", 3 => "Четверг", 4 => "Пятница");
// $arr = array(0 => "Понедельник", 1 => "Среда", 2 => "Четверг", 3 => "Пятница");

echo array_reduce($arr, function ($carry, $item) {
    $next = [
        "Понедельник" => "Вторник",
        "Вторник" => "Среда",
        "Среда" => "Четверг",
        "Четверг" => "Пятница",
        "Пятница" => "Суббота",
        "Суббота" => "Воскресенье",
    ];
    if (empty($carry)) {
        return $item;
    }
    if (strpos($carry, '-') > 0) {
        list($start, $end) = explode('-', $carry);
        if ($next[$end] == $item) {
            return $start . '-' . $item;
        }
    }
    if (isset($next[$carry]) && $next[$carry] == $item) {
        return $carry . '-' . $item;
    }
    if (strpos($carry, ',') > 0) {
        $prev = explode(',', $carry);
        $last = array_pop($prev);
        if ($next[$last] == $item) {
            return implode(',', $prev) . ',' . $last . '-' . $item;
        }
    }
    return $carry . ',' . $item;
}, "");
Спасибо, то что нужно! Интересное решение. А я тупил через множество условий. ((
 

antson

Новичок
Партнер клуба
Если это учебное задание, то попробуй реализовать базовый класс и дочек для нундин и т.д.
https://ru.wikipedia.org/wiki/Неделя
Другие недели.

Также пригодится метод для сортировки массива на случай если дни недели в разнобой.
И свертку еще можно делать через стек, в который пушить если последовательность нарушается.

И вообще твоя задача прекрасно подходит для изучения ооп
тут можно сделать абстрактный класс неделя
реализации классической и нестандартной .
Еще один класс рабочий период.
а еще добавить поддержку мультилангвиджа.
 
Последнее редактирование:
Сверху