3

我是这个论坛的新手,想寻求帮助。最近我不得不在一组网站中实现 schema.org/LocalBusiness 微数据,但问题是我需要动态添加它。在开放时间出来之前,一切都很容易。因此,架构希望显示小时数的方式是:

  <meta itemprop="openingHours" content="Mo-Sa 11:00-14:30">Mon-Sat 11am - 2:30pm
  <meta itemprop="openingHours" content="Mo-Th 17:00-21:30">Mon-Thu 5pm - 9:30pm
  <meta itemprop="openingHours" content="Fr-Sa 17:00-22:00">Fri-Sat 5pm - 10:00pm

我只设法分别显示每天的营业时间,但我需要将它们显示为上面的代码。

我所做的尝试是从我的营业时间表格中获取数据到一个数组中。例如:

$days = array('mo' => '13:00-20:00',
        'tu' => '13:00-20:00',
        'we' => '13:00-20:00',
        'th' => '11:00-18:00',
        'fr' => '11:00-18:00',
        'sa' => '15:00-22:00',
        'su' => '13:00-20:00',);

我需要从此数组显示的结果是:

<meta itemprop="openingHours" content="Mo-We 13:00-20:00">Mon-We 13:00-20:00
  <meta itemprop="openingHours" content="Th-Fr 11:00-18:00">Th-Fr 11:00-18:00
  <meta itemprop="openingHours" content="Sa 15:00-22:00">Sat 15:00-22:00
  <meta itemprop="openingHours" content="Su 13:00-20:00">Sun 13:00-20:00

并尝试循环这个数组,里面有很多 if。所以,可能你们中的大多数人都知道,像这样我不会一事无成。这是我的代码。我没有测试过这段代码,因为我不知道如何检索 $last_key's_value_equal。希望任何人都能理解我,因为我的解释不是很好,但如果有人能帮助我,我将不胜感激。

foreach($day as $key=>$value){
    if($value == next($day)){
        if($value == next($day)){
            if($value == next($day)){
                if($value == next($day)){
                    if($value == next($day)){
                        if($value == next($day)){
                        $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
                        }else{
                        $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
                        }
                    }else{
                    $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
                    }
                $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
                }else{
                $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
                }
            $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
            }else{
            $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
            }
        $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
        }else{
        $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
        }
    $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
    else{
    $opening_hours .= $key.'-'.$last_key's_value_equal.' '.$value;
    }
}
4

1 回答 1

2

保留一系列连续的组。当您遍历您的$days时,检查最后一项是否具有相同的小时数。如果是,将日期添加到同一组;如果没有,请创建一个新组。

例如,这个函数,当应用于你的$days数组时:

function group_contiguous_values($arr) {
    $groups = array();
    foreach ($arr as $k => $v) {
        $lastidx = count($groups)-1;
        if (isset($groups[$lastidx][$v])) {
            $groups[$lastidx][$v][] = $k;
        } else {
            $groups[] = array($v => array($k));
        }
    }
    return $groups;
}

会产生这样的结果:

array(
  array('13:00-20:00' => array('mo', 'tu', 'we')),
  array('11:00-18:00' => array('th', 'fr')),
  array('15:00-22:00' => array('sa')),
  array('13:00-20:00' => array('su')),
);

从那里获得您想要的人类可读版本只是一件麻烦事。此代码将处理 itemprop

$time_templ = '<time itemprop="openingHours" datetime="%s %s">%s %s</time>'."\n";

foreach ($business_hours as $group) {
    list($hours, $days) = each($group);
    list($open, $close) = explode('-', $hours, 2);
    $firstday = ucfirst($days[0]);
    $lastday = (count($days)>1) ? ucfirst(end($days)) : null;
    $meta_days = $firstday;
    if ($lastday) {
        $meta_days .= "-$lastday";
    }
    $meta_hours = $hours;

    printf($time_templ, $meta_days, $meta_hours, $meta_days, $meta_hours);
}

哪个打印:

<time itemprop="openingHours" datetime="Mo-We 13:00-20:00">Mo-We 13:00-20:00</time>
<time itemprop="openingHours" datetime="Th-Fr 11:00-18:00">Th-Fr 11:00-18:00</time>
<time itemprop="openingHours" datetime="Sa 15:00-22:00">Sa 15:00-22:00</time>
<time itemprop="openingHours" datetime="Su 13:00-20:00">Su 13:00-20:00</time>
于 2013-04-12T19:49:24.697 回答