<?php
$list = array(
    array('begin_time' => 11, 'end_time' => 12),
    array('begin_time' => 1, 'end_time' => 4),
    array('begin_time' => 2, 'end_time' => 3),
    array('begin_time' => 2, 'end_time' => 7),
    array('begin_time' => 9, 'end_time' => 12),
    array('begin_time' => 11, 'end_time' => 13),
    array('begin_time' => 11, 'end_time' => 18),
);

$list = concatTimeRage($list);
echo '
';print_r($list);
    
    
    /**
     * 为二维数组排序
     * @param array $list 二维数组数据
     * @param string $firstField 排序的字段1
     * @param int $firstFieldSort 字段1的排序规则
     * @param string $secondField 排序的字段2
     * @param int $secondFieldSort 字段2的排序规则
     * @return array
     */
    function arrayMultiSort($list, $firstField, $firstFieldSort = SORT_DESC, $secondField = null, $secondFieldSort = SORT_DESC)
    {
        if (!is_array($list) || !$list) {
            return $list;
        }
        $firstFieldValueList = array_column($list, $firstField);
        if (!$firstFieldValueList) {
            return $list;
        }
        if ($firstField) {
            if ($secondField) {
                $secondFieldValueList = array_column($list, $secondField);
                array_multisort($firstFieldValueList, $firstFieldSort, $secondFieldValueList, $secondFieldSort, $list);
            }
            else {
                array_multisort($firstFieldValueList, $firstFieldSort, $list);
            }
        }
        return $list;
    }
    
    /**
     * 合并多个时间段
     * @param array $list
     * @param bool $sort 是否预先排序二维数组
     * @param string $beginTimeField 开始时间的字段名称
     * @param string $endTimeField 结束时间的字段名称
     * @return array
     */
    function concatTimeRage($list, $sort = true, $beginTimeField = 'begin_time', $endTimeField = 'end_time')
    {
        if (!is_array($list) || !$list) {
            return $list;
        }
        $list = $sort ? arrayMultiSort($list, $beginTimeField, SORT_ASC, $endTimeField, SORT_ASC) : $list;
        foreach ($list as $key => $curNode) {
            if (!$key) {
                continue;
            }
            if (!isset($list[$key - 1])) {
                return concatTimeRage(array_values($list));
            }
            $preNode = $list[$key - 1];
            if ($curNode[$beginTimeField] < $preNode[$endTimeField]) {
                if ($curNode[$endTimeField] > $preNode[$endTimeField]) {
                    $list[$key - 1][$endTimeField] = $curNode[$endTimeField];
                }
                unset($list[$key]);
            }
        }
        return $list;
    }