构造对象数组


Structuring an Array of objects

我的项目有这个Open Days对象数组。

stdClass Object
(
    [Mon] => stdClass Object
        (
            [DAY_NAME] => Mon
        )
    [Tue] => stdClass Object
        (
            [DAY_NAME] => Tue
        )
    [Wed] => stdClass Object
        (
            [DAY_NAME] => Wed
        )
    [Sat] => stdClass Object
        (
            [DAY_NAME] => Sat
        )
    [Sun] => stdClass Object
        (
            [DAY_NAME] => Sun
            [SPECIAL_START_TIME] => 12:00 am
            [SPECIAL_END_TIME] => 08:54 pm
        )
)

所以,当我需要打印from open day时,我取数组的第一个元素,而to open day,我取阵列的最后一个元素。但在这期间,星期四和星期五是不营业的。我需要的结果视图是

Mon-Wed, Sat - #some-time-here
Sun - #Some-time-here

我很困惑我应该如何处理这个

因此,从开放到关闭的时间是唯一的实体,而天数是每个实体的相关实体。这表示一个数据结构,其中打开到关闭时间是相关日期地图中的关键。在PHP中,它看起来像这样:

$out = array(
    '10:00-18:00' => array('Mon', 'Tue', 'Wed', 'Sat'),
    '12:00-17:00' => array('Sun')
);

构建这个数组只需通过一个对象的循环:

$out = array();
foreach($obj as $day => $data) {
    $time_key = $data->SPECIAL_START_TIME . '-' . $data->SPECIAL_END_TIME;
    if(!array_key_exists($time_key, $out)) { 
        $out[$time_key] = array();
    }
    $out[$time_key][] = $day;
}

现在,您必须在天范围内"压缩"连续的天数(array('Mon', 'Tue', 'Wed')变为'Mon-Wed'):

$order = array(
    'Sun' => 0,
    'Mon' => 1,
    'Tue' => 2,
    'Wed' => 3,
    'Thu' => 4,
    'Fri' => 5,
    'Sat' => 6
);
$in = array('Mon', 'Tue', 'Thu', 'Fri', 'Sat', 'Sun');
function group_days($in, $order) {
    $out = array();
    $outIndex = -1;
    $prevIndex = -1;
    foreach($in as $day) {
        if($order[$day] - $prevIndex !== 1 || $outIndex === -1) {
            $outIndex += 1;
            $out[$outIndex] = array();
        }
        $prevIndex = $order[$day];
        $out[$outIndex][] = $day;
    }
    return $out;
}
$groups = group_days($in, $order);
foreach($groups as $group) {
    if(count($group) === 1) {
        echo $group[0] . PHP_EOL;
    }
    else {
        echo $group[0] . '-' . $group[count($group) -1] . PHP_EOL;
    }
}