检查重复值并将其合并到php mysql

检查重复值并将其合并到php mysql,php,mysql,arrays,codeigniter,Php,Mysql,Arrays,Codeigniter,我如何知道重复的值,并将其删除 这是我的密码 function _get($limit=NULL) { $results = array(); $single = array(); $this->db->select("MAX(schedule.start_at) as max_start, MAX(schedule.end_at) as max_end"); $this->db->

我如何知道重复的值,并将其删除

这是我的密码

function _get($limit=NULL)
    {
        $results = array();
        $single = array();
        $this->db->select("MAX(schedule.start_at) as max_start, MAX(schedule.end_at) as max_end");
        $this->db->group_by(array("schedule.start_at", "schedule.end_at"));
        $this->db->from("schedule2_tbl as schedule");
        $q = $this->db->get();

        if( $q->num_rows() ) 
        {
            $data = $q->result_array();
            // return $data;

            foreach($data as $key => $row){
                $single[] = $row;
            }
            $results = $single;
            return $results;

        }
        
    }

这是我的结果

{
"max_start": "2020-07-02 05:30:00",
"max_end": "2020-07-02 06:30:00"
},
{
"max_start": "2020-07-02 06:30:00",
"max_end": "2020-07-02 07:00:00"
},
{
"max_start": "2020-07-02 06:30:00",
"max_end": "2020-07-02 07:30:00"
},
{
"max_start": "2020-07-02 07:00:00",
"max_end": "2020-07-02 07:30:00"
}
如果max_start,max_end已经存在,则取最大值。 例如,如果max_start 06:30:00和max_end 07:30:00, 有三个价值观

{
"max_start": "2020-07-02 06:30:00",
"max_end": "2020-07-02 07:00:00"
},
{
"max_start": "2020-07-02 06:30:00",
"max_end": "2020-07-02 07:30:00"
},
{
"max_start": "2020-07-02 07:00:00",
"max_end": "2020-07-02 07:30:00"
}
在这种情况下,我必须只存储最大开始值和最大结束值的最小值, 那是06:30:00到07:30:00

请帮忙

更新

当我向数组添加更多值时,firs数组显示错误。 它正在显示

2020-07-02 05:30:00 - 2020-07-02 07:30:00 
2020-07-02 07:30:00 - 2020-07-02 08:30:00..... 
但是,它应该显示,

2020-07-02 05:30:00 - 2020-07-02 06:30:00 
2020-07-02 06:30:00 - 2020-07-02 07:30:00.....
这是我的密码

$initialData = $data = [
                                        [
                                        "max_start": "2020-07-02 05:30:00",
                                        "max_end": "2020-07-02 06:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 06:00:00",
                                        "max_end": "2020-07-02 07:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 06:30:00",
                                        "max_end": "2020-07-02 07:00:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 06:30:00",
                                        "max_end": "2020-07-02 07:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 07:00:00",
                                        "max_end": "2020-07-02 07:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 07:30:00",
                                        "max_end": "2020-07-02 08:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 08:30:00",
                                        "max_end": "2020-07-02 09:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 09:30:00",
                                        "max_end": "2020-07-02 11:15:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 11:15:00",
                                        "max_end": "2020-07-02 11:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 11:30:00",
                                        "max_end": "2020-07-02 12:00:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 11:30:00",
                                        "max_end": "2020-07-02 12:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 12:00:00",
                                        "max_end": "2020-07-02 12:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 12:30:00",
                                        "max_end": "2020-07-02 13:00:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 12:30:00",
                                        "max_end": "2020-07-02 13:30:00"
                                        ],
                                        [
                                        "max_start": "2020-07-02 13:00:00",
                                        "max_end": "2020-07-02 13:30:00"
                                        ]
                                    ];

            // Order the list chronologically by the "max_start" value, to make comparison easier later
            usort($data, function($a, $b){
                return $a['max_start'] <=> $b['max_start'];
            });


            // Final result will be collected here
            $result = [];

            // Work with the first list value as long there is one
            while ($currentInterval = array_shift($data)) {
                
                // Compare with each other value in the list
                foreach ($data as $index => $interval) {
                    
                    // Check if intervals overlap
                    // Replace "<" with a "<=" if you want to merge intervals that "touch": one interval ends at the same time another one begins
                    if ($interval['max_start'] < $currentInterval['max_end']) {

                        // Merge when needed
                        $currentInterval['max_end'] = max ($currentInterval['max_end'], $interval['max_end']);
                        
                        // Remove the merged interval
                        unset($data[$index]);
                        
                    }
                }
                
                // Add to result
                $result[] = $currentInterval;
            }
            return $result; 
以前的代码:

$initialData = $data = $q->result_array();

            // Order the list chronologically by the "max_start" value, to make comparison easier later
            usort($data, function($a, $b){
                return $a['max_start'] <=> $b['max_start'];
            });


            // Final result will be collected here
            $result = [];

            // Work with the first list value as long there is one
            while ($currentInterval = array_shift($data)) {
                
                // Compare with each other value in the list
                foreach ($data as $index => $interval) {
                    
                    // Check if intervals overlap
                    // Replace "<" with a "<=" if you want to merge intervals that "touch": one interval ends at the same time another one begins
                    if ($interval['max_start'] < $currentInterval['max_end']) {

                        // Merge when needed
                        $currentInterval['max_end'] = max ($currentInterval['max_end'], $interval['max_end']);
                        
                        // Remove the merged interval
                        unset($data[$index]);
                        
                    }
                }
                
                // Add to result
                $result[] = $currentInterval;
}
return $result;
$initialData=$data=$q->result_array();
//按“max_start”值按时间顺序排列列表,以便于以后比较
usort($data,function($a,$b){
返回$a['max_start']$b['max_start'];
});
//最终结果将在这里收集
$result=[];
//使用第一个列表值,只要有一个
while($currentInterval=array\u shift($data)){
//与列表中的其他值进行比较
foreach($index=>$interval形式的数据){
//检查间隔是否重叠

//替换“这里有一个代码片段,它将使用您发布的数据格式

$initialData=$data=[
[
“最大开始时间”=>“2020-07-02 05:30:00”,
“max_end”=>“2020-07-02 06:30:00”,
],
[
“最大开始时间”=>“2020-07-02 07:00:00”,
“max_end”=>“2020-07-02 07:30:00”,
],
[
“最大开始时间”=>“2020-07-02 06:30:00”,
“max_end”=>“2020-07-02 07:00:00”,
],
[
“最大开始时间”=>“2020-07-02 06:30:00”,
“max_end”=>“2020-07-02 07:30:00”,
]
];
//按“max_start”值按时间顺序排列列表,以便于以后比较
usort($data,function($a,$b){
返回$a['max_start']$b['max_start'];
});
//最终结果将在这里收集
$result=[];
//使用第一个列表值,只要有一个
while($currentInterval=array\u shift($data)){
//与列表中的其他值进行比较
foreach($index=>$interval形式的数据){
//检查间隔是否同时开始
如果($interval['max\u start']=$currentInterval['max\u start'])){
//需要时合并
$currentInterval['max_end']=max($currentInterval['max_end'],$interval['max_end']);
//删除合并的间隔
未设置($data[$index]);
}
}
//增加结果
$result[]=$currentInterval;
}
回显“初始列表:”,PHP_EOL,print_r($initialData,true);
echo“合并列表:”,PHP_EOL,print_r($result,true);
此代码段具有以下输出:

Initial list: 
Array
(
    [0] => Array
        (
            [max_start] => 2020-07-02 05:30:00
            [max_end] => 2020-07-02 06:30:00
        )

    [1] => Array
        (
            [max_start] => 2020-07-02 07:00:00
            [max_end] => 2020-07-02 07:30:00
        )

    [2] => Array
        (
            [max_start] => 2020-07-02 06:30:00
            [max_end] => 2020-07-02 07:00:00
        )

    [3] => Array
        (
            [max_start] => 2020-07-02 06:30:00
            [max_end] => 2020-07-02 07:30:00
        )

)
Merged list: 
Array
(
    [0] => Array
        (
            [max_start] => 2020-07-02 05:30:00
            [max_end] => 2020-07-02 06:30:00
        )

    [1] => Array
        (
            [max_start] => 2020-07-02 06:30:00
            [max_end] => 2020-07-02 07:30:00
        )

    [2] => Array
        (
            [max_start] => 2020-07-02 07:00:00
            [max_end] => 2020-07-02 07:30:00
        )

)
让我知道它是否适合您的需要,或者如果需要进一步调整


对于
PHP
7.0
之前的版本,将
usort
代码替换为以下代码:

usort($data,function($a,$b){
如果($a['max\u start']=$b['max\u start'])){
返回0;
}
返回$a['max_start']>$b['max_start']?-1:1;
});

请注意,
PHP5.6
在2018年12月31日达到其生命终止状态,不建议再使用它。

Hi,首先非常感谢您的回答。我已经更新了我的问题…当我预测数组的第一个值出错时,显示为2020-07-02 05:30:00-2020-07-02 07:30:00然后2020-07-02 07:30:00到2020-07-02 08:30:00…..它应该显示2020-07-02 05:30:00-2020-07-02 06:30:00然后2020-07-02 06:30:00到2020-07-02 07:30:00…..请看一看。问题在这个数组中
['max_start'=>'2020-07-02 06:00:00','max_end'=>'2020-07-02 07:30:00'],
我想我误解了你的问题。我原以为你想合并任何和所有重叠的区间,但现在我发现你只想合并具有相同起点的区间。请告诉我这种解释是否正确,我将更新我的代码。请告诉我这是否对你有帮助,或者需要进一步调整。我ave将我的php版本更新为7.0并修复了该问题。。。。
Initial list: 
Array
(
    [0] => Array
        (
            [max_start] => 2020-07-02 05:30:00
            [max_end] => 2020-07-02 06:30:00
        )

    [1] => Array
        (
            [max_start] => 2020-07-02 07:00:00
            [max_end] => 2020-07-02 07:30:00
        )

    [2] => Array
        (
            [max_start] => 2020-07-02 06:30:00
            [max_end] => 2020-07-02 07:00:00
        )

    [3] => Array
        (
            [max_start] => 2020-07-02 06:30:00
            [max_end] => 2020-07-02 07:30:00
        )

)
Merged list: 
Array
(
    [0] => Array
        (
            [max_start] => 2020-07-02 05:30:00
            [max_end] => 2020-07-02 06:30:00
        )

    [1] => Array
        (
            [max_start] => 2020-07-02 06:30:00
            [max_end] => 2020-07-02 07:30:00
        )

    [2] => Array
        (
            [max_start] => 2020-07-02 07:00:00
            [max_end] => 2020-07-02 07:30:00
        )

)