из даты вывода массива с понедельника по пятницу

#php #arrays #sorting

#php #массивы #сортировка

Вопрос:

Я хотел бы вывести приведенный ниже массив в базовом формате недели с понедельника по пятницу, например:

ВЫХОДНОЙ СИГНАЛ:

Mi 06.01. — Fr 08.01.

Понедельник 11.01. — Пятница 15.01.

Есть какие-нибудь предложения, как я могу исключить промежуточные дни недели?

   [0]=>
  string(9) "Mi 06.01."
  [1]=>
  string(9) "Do 07.01."
  [2]=>
  string(9) "Fr 08.01."
  [3]=>
  string(9) "Mo 11.01."
  [4]=>
  string(9) "Di 12.01."
  [5]=>
  string(9) "Mi 13.01."
  [6]=>
  string(9) "Do 14.01."
  [7]=>
  string(9) "Fr 15.01."
  [8]=>
  string(9) "Mo 18.01."
  [9]=>
  string(9) "Di 19.01."
  [10]=>
  string(9) "Mi 20.01."
  [11]=>
  string(9) "Do 21.01."
  [12]=>
  string(9) "Fr 22.01."
  [13]=>
  string(9) "Mo 25.01."
  [14]=>
  string(9) "Di 26.01."
  [15]=>
  string(9) "Mi 27.01."
  [16]=>
  string(9) "Do 28.01."
  [17]=>
  string(9) "Fr 29.01."
}

 

Ответ №1:

Вы могли бы просто создать цикл, удалить ненужные элементы и создать новый массив.. Наверное, проще всего вот так..

 <?php
$old_array = array();

$old_array[0] = "Mi 06.01.";
$old_array[1] = "Do 06.01.";
$old_array[2] = "Fr 06.01.";
$old_array[3] = "Mi 06.01.";
$old_array[4] = "Mo 06.01.";




$new_array = array();
foreach ($old_array as $item){
    if (strpos($item, 'Mo') !== false || // Checks if $item conains "Mo" 
        strpos($item, 'Mi') !== false) { // Checks if $item conains "Mi" 
        // push to new array
        array_push($new_array ,$item);
    }
}
print_r($new_array);
 

$new_array выходной сигнал:

 Array
(
    [0] => Mi 06.01.
    [1] => Mi 06.01.
    [2] => Mo 06.01.
)
 

Это будет немного трудоемко, но на самом деле это самый простой способ добиться цели. Чтобы получить свой «диапазон», вы можете создать функцию с «началом» и «концом» и сравнить ее таким образом с return вашим диапазоном в виде строки или массива и т.д. И т.п..

 <?php
$old_array = array();

$old_array[0]= "Mi 06.01.";
$old_array[1]= "Do 07.01.";
$old_array[2]= "Fr 08.01.";
$old_array[3]= "Mo 11.01.";
$old_array[4]= "Di 12.01.";
$old_array[5]= "Mi 13.01.";
$old_array[6]= "Do 14.01.";
$old_array[7]= "Fr 15.01.";
$old_array[8]= "Mo 18.01.";
$old_array[9]= "Di 19.01.";
$old_array[10]= "Mi 20.01.";
$old_array[11]= "Do 21.01.";
$old_array[12]= "Fr 22.01.";
$old_array[13]= "Mo 25.01.";
$old_array[14]= "Di 26.01.";
$old_array[15]= "Mi 27.01.";
$old_array[16]= "Do 28.01.";
$old_array[17]= "Fr 29.01.";


$start_day = "Mi 06.01.";
$end_day = "Fr 08.01.";

$new_array = makeNewArray($old_array, $start_day, $end_day);
print_r( $new_array );



function makeNewArray($old_array, $start_day, $end_day){
    $new_array = array();
    foreach ($old_array as $item){
        if ($start_day == $item){
            $new_array['start'] = $item;
        }
        if ($end_day == $item){
            $new_array['end'] = $item;
        }
    }
    return $new_array;
}
 

Выходной сигнал:

 Array
(
    [start] => Mi 06.01.
    [end] => Fr 08.01.
)
Start = Mi 06.01.
End = Fr 08.01.
 

Ответ №2:

Если я правильно понимаю, вы хотите автоматически создавать строки диапазона. Это должно сделать это. Предоставлено не так много информации, поэтому я делаю некоторые предположения, например. даты уже в правильном порядке.

Выходной сигнал:

 array(4) {
[0]=>
string(21) "Mi 06.01. - Fr 08.01."
[1]=>
string(21) "Mo 11.01. - Fr 15.01."
[2]=>
string(21) "Mo 18.01. - Fr 22.01."
[3]=>
string(21) "Mo 25.01. - Fr 29.01."
}
 

Встроенные пояснения:

 $date_ranges = [];
$current_week_string = false;

foreach ($dates as $date) {

    // unsure how to easily parse the german day abbreviations so i'll ignore them
    // with ?? and use the dates instead
    $datetime = DateTime::createFromFormat('?? d.m.', $date);

    // year-week e.g. 2021-01, to keep track of when we change to the next week
    $week_string = $datetime->format('Y-W');

    // still in the same week as the previous date. skip for now
    if ($current_week_string == $week_string) {
        $previous_date = $date;
        continue;
    }

    // create the date range (unless this is the first iteration)
    if ($current_week_string !== false) {
        $date_ranges[] = $start_of_week . ' - ' . $previous_date;
    }

    // reset everything for the next loop
    $start_of_week = $date;
    $current_week_string = $week_string;
    $previous_date = $date;
}

// create the range for the final date
$date_ranges[] = $start_of_week . ' - ' . $date;

var_dump($date_ranges);