#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);