检查重复值并将其合并到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
)
)