构造一个对象数组

时间:2015-03-30 07:50:48

标签: php arrays

我的项目有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时,我会获取数组的第一个元素,并且在开放日期间,我将获取数组的结束元素。 但在此期间,周四和周五关闭。 我需要的结果是

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

我对如何处理这个问题非常困惑

1 个答案:

答案 0 :(得分:1)

所以开放时间是独特的实体,而日子是每个实体的相关实体。这表示开放关闭时间是相关日期地图中的关键字的数据结构。 在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;
    }
}