检查重复值并合并它们 php mysql

Checking Duplicate values and merge them php mysql

我怎样才能知道重复的值,并删除它,

这是我的代码...

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"
}

在这种情况下,我必须只存储 max_start 的最小值和最大的 max_end 值, 那是 06:30:00 到 07:30:00。

请帮忙。

更新

当我向数组添加更多值时,第一个数组显示错误。 正在显示,

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; 

这是我的结果:

[
[
"max_start": "2020-07-02 05:30: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:30:00"
],
[
"max_start": "2020-07-02 12:30:00",
"max_end": "2020-07-02 13:30:00"
]
]

前一个代码:

$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 = [
  [
    'max_start' => '2020-07-02 05:30:00',
    'max_end' => '2020-07-02 06:30:00',
  ],
  [
    'max_start' => '2020-07-02 07: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',
  ]
];

// 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 start at the same time
        if ($interval['max_start'] == $currentInterval['max_start']) {

            // 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;
}

echo 'Initial list: ', PHP_EOL, print_r($initialData, true);
echo 'Merged list: ', 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
        )

)

如果符合您的需要或需要进一步调整,请告诉我。


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

usort($data, function($a, $b){

    if ($a['max_start'] == $b['max_start']) {
        return 0;
    }

    return $a['max_start'] > $b['max_start'] ? -1 : 1;
});

请注意,PHP 5.6 已于 2018 年 12 月 31 日达到生命周期结束状态,不建议再使用它。