arrays — генерирует дни недели из значений, разделенных запятыми, в переполнении стека

У меня есть массив в PHP, где я храню значения дня

$days = array (
1 => 'Mon',
2 => 'Tue',
3 => 'Wed',
4 => 'Thu',
5 => 'Fri',
6 => 'Sat',
7 => 'Sun'
);

У меня есть значения, разделенные запятыми, которые обозначают ключи переменной $ days. Если серия

1, 2, 3, 4, 5, 6, 7, то это должно отображаться как «пн — вс».

1,2,3,4,5, то он должен отображаться как «пн — пт».

1, 2, 4, 5, 6, то должно отображаться «пн — вт, чт — сб»

1,3,5,7, тогда должно отображаться «пн, ср, пт, вс»

Приведенный ниже код будет генерировать только «пн — вт — ср — чт — пт» для серии 1,2,3,4,5

    $keys  = "1,2,3,4,5,6";
$days = array('1' => 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

$key_array = explode(',', $keys);

$day_series = $first_day = $days[reset($key_array)];
$first_value = reset($key_array);

foreach ($key_array as $key => $value) {
if ($first_value != $value) {
if ($value == $i) {
$day_series = $day_series . ' - ' . $days[$value];
} else
$day_series = $day_series  . ', ' . $days[$value];
}
$i++;
}
echo $day_series;

0

Решение

Удалить else от твоего foreach петля, как это

foreach ($key_array as $key => $value) {
if ($first_value != $value) {
if ($value == $i) {
$day_series = $day_series . ' - ' . $days[$value];
}
$i++;
}
}
$day_series = $day_series  . ', ' . $days[$value];
echo $day_series;

Это должно работать, чтобы дать вам Mon-Fri за 1,2,3,4,5

0

Другие решения

Это неуклюже, но это работает.

$DAY_NUMBER = array( 'Mon' => 0, 'Tue' => 1, 'Wed' => 2, 'Thu' => 3, 'Fri' => 4, 'Sat' => 5, 'Sun' => 6 );

$NUMBER_DAY = array( 0 => 'Mon', 1 => 'Tue', 2 => 'Wed', 3 => 'Thu', 4 => 'Fri', 5 => 'Sat', 6 => 'Sun' );function day_series ( $day_list ) {

global $DAY_NUMBER, $NUMBER_DAY;

// CONVERT DAY NAMES TO NUMBERS
$num_list = array();
for( $n = 0; $n < count($day_list); $n++ ) {
$num_list[] = $DAY_NUMBER[$day_list[$n]];
}

// ALLOW FOR WRAP AROUND
$first = $num_list[0];
for( $n = 0; $n < count($num_list); $n++ ) {
if( $num_list[$n] < $first ) {
$num_list[$n] += 7;
}
}

$day_series = array();

while( !empty($num_list) ) {

$first = $last = array_shift($num_list);

while( !empty($num_list) && ( $last+1 == $num_list[0] ) ) {
$last = array_shift($num_list);
}

if( $first == $last ) {
$day_series[] = $NUMBER_DAY[ $first % 7 ];
} else if( $first+1 == $last ) {
$day_series[] = $NUMBER_DAY[ $first % 7 ] . ',' . $NUMBER_DAY[ $last % 7 ];
} else {
$day_series[] = $NUMBER_DAY[ $first % 7 ] . '-' . $NUMBER_DAY[ $last % 7 ];
}
}

// RETURN AS JOINED STRING
return join(',', $day_series );
}
0

По вопросам рекламы [email protected]