如何在下拉列表中围绕php数组值包装optgroup标签

时间:2012-10-29 20:53:32

标签: php arrays foreach

我有一个名为$ selection的数组,其中包含从15:00到18:00的15分钟间隔的升序时间值。

例如:$ selection = array(09:00,09:15,09:30,09:45,10:00,10:15,10:30);

某些间隔可能会丢失,因为此数组是从某些先前的代码生成的,该代码确定了谷歌日历中可用的时间(以及其他内容)。 09:00并不总是开始时间,有时整个上午都可以预订。

我正在使用此数组创建一个下拉列表。

foreach($selection as $slot) {
  if ( $slot == $selection[0] ) {
    print '<option value="'.$slot.'" selected="selected">'.date('H:i',  strtotime($slot)).'</option>';
  } else {
    print '<option value="'.$slot.'">'.date('H:i', strtotime($slot)).'</option>';
  } // end else
}

问题

我正在尝试添加

<optgroup label="Morning"> .. </optgroup>

<optgroup label="Afternoon"> .. </optgroup>

不知道该怎么做。我得出结论,我需要一个while循环。甚至可能在运行foreach循环之前将额外的信息添加到数组中..不确定!

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

对于排序数组

$interval = '';
$prev_interval = '';

foreach($selection as $slot) 
{
    // Check if selected option

    $sel = ( $slot == $selection[0] ) ? ' selected = "selected" ' : '';

    // Set optgroup interval; 
    // for HH:MM we can use basic string alphabet comaparsion

    if ($slot > '22:00')
    {
       $interval = 'Night';
    } 
    else if ($slot > '18:00')
    {
       $interval = 'Evening';
    }
   ...

    // check if interval has changed

    if ($prev_interval != $interval)
    {  
       // check if previous intrval was set

       if ($prev_interval!='') {  echo "</optgroup>" };

       printf('<optgroup label="%s">',$interval); 
    } 

    printf('<option value="%s"%s>%s</option>',$slot,$sel,date('H:i',  strtotime($slot)))  ;

    $prev_interval = $interval;
}

// last close element

if ($interval!='') { echo '</optgroup>'; } 

如果之前无法对数组进行排序,只需在循环时存储到2D数组并在之后打印。

答案 1 :(得分:0)

$interval = '';
$prev_interval = '';

foreach($selection as $slot) {
// Check if selected option

if ( $slot == $selection[0] ) {

  $sel = "selected = \"selected\"";
}

else { $sel = '';}

//$sel = ( $slot == $selection[0] ) ? ' selected = "selected" : '';

// Set optgroup interval; 
// for HH:MM we can use basic string alphabet comaparsion

if (date('H:i', strtotime($slot)) > '18:30') {
   $interval = 'Evening';
}

else if (date('H:i', strtotime($slot)) > '15:30') {
   $interval = 'Late Afternoon';
}

else if (date('H:i', strtotime($slot)) > '12:00') {
   $interval = 'Early Afternoon';
}

else if (date('H:i', strtotime($slot)) > '10:30') {
   $interval = 'Late Morning';
}  

else if (date('H:i', strtotime($slot)) > '09:00') {
   $interval = 'Early Morning';
}

// check if interval has changed
if ($prev_interval != $interval) {  
   // check if previous intrval was set

   if ($prev_interval!='') {
    echo "</optgroup>";
  }

   printf('<optgroup label="%s">',$interval); 
} 

printf('<option value="%s"%s>%s</option>',$slot,$sel,date('H:i',  strtotime($slot)))  ;

$prev_interval = $interval;
}

// last close element

if ($interval!='') { echo '</optgroup>'; }