我有数组
$arr = array (
0 =>
array (
'id' => '340',
'days' => '1',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-13 00:00:00',
),
1 =>
array (
'id' => '346',
'days' => '2',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-14 00:00:00',
),
2 =>
array (
'id' => '339',
'days' => '3',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-15 00:00:00',
),
3 =>
array (
'id' => '302',
'days' => '4',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-16 00:00:00',
),
4 =>
array (
'id' => '308',
'days' => '5',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-17 00:00:00',
),
5 =>
array (
'id' => '354',
'days' => '1',
'start_date' => '2018-10-13 00:00:00',
'end_date' => '2018-10-14 00:00:00',
),
6 =>
array (
'id' => '369',
'days' => '1',
'start_date' => '2018-10-14 00:00:00',
'end_date' => '2018-10-15 00:00:00',
)
);
输出:
$arr = array (
0 =>
array (
'id' => '308',
'days' => '5',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-17 00:00:00',
),
1 =>
array (
'id' => '354',
'days' => '1',
'start_date' => '2018-10-13 00:00:00',
'end_date' => '2018-10-14 00:00:00',
),
2 =>
array (
'id' => '369',
'days' => '1',
'start_date' => '2018-10-14 00:00:00',
'end_date' => '2018-10-15 00:00:00',
)
);
条件:
我想删除重复的'start_date',即start_date = 2018-10-12,且天数最少,并且只保留包含更多天数的日期。我尝试使用mysql查询,但是我没有得到想要的输出,我也尝试了使用array_unique()和数字格式参数,但是还没有成功。感谢帮助。提前谢谢。
答案 0 :(得分:1)
这是在PHP中执行此操作的方法:
foreach ($arr as $row) {
$key = $row["start_date"];
if (!isset($result[$key]) || $result[$key]["days"] < $row["days"]) {
$result[$key] = $row;
}
}
$result = array_values($result);
请注意在<
条件下的if
:这可确保您获得的记录天数最多。切换到>
以获得最少的天数。
答案 1 :(得分:1)
第1步:使用days
列值将数组的数组从最低到最高排序。
usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});
*巧合的是,由于您的数据已经处于适当的顺序,因此可以避免此步骤。
步骤2:使用数组列为每个子数组分配关联键。通常,数组不能包含重复的键,因此较早的行将被较后的行覆盖(删除),这将产生所需的结果。 array_values()
被调用以删除临时密钥。
var_export(array_values(array_column($arr, null, 'start_date')));
代码:(Demo)
$arr = [
['id' => '340', 'days' => '1', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-13 00:00:00'],
['id' => '346', 'days' => '2', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-14 00:00:00'],
['id' => '339', 'days' => '3', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-15 00:00:00'],
['id' => '302', 'days' => '4', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-16 00:00:00'],
['id' => '308', 'days' => '5', 'start_date' => '2018-10-12 00:00:00', 'end_date' => '2018-10-17 00:00:00'],
['id' => '354', 'days' => '1', 'start_date' => '2018-10-13 00:00:00', 'end_date' => '2018-10-14 00:00:00'],
['id' => '369', 'days' => '1', 'start_date' => '2018-10-14 00:00:00', 'end_date' => '2018-10-15 00:00:00']
];
usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});
var_export(array_values(array_column($arr, null, 'start_date')));
输出:
array (
0 =>
array (
'id' => '308',
'days' => '5',
'start_date' => '2018-10-12 00:00:00',
'end_date' => '2018-10-17 00:00:00',
),
1 =>
array (
'id' => '354',
'days' => '1',
'start_date' => '2018-10-13 00:00:00',
'end_date' => '2018-10-14 00:00:00',
),
2 =>
array (
'id' => '369',
'days' => '1',
'start_date' => '2018-10-14 00:00:00',
'end_date' => '2018-10-15 00:00:00',
),
)
答案 2 :(得分:0)
没有任何默认函数,因此请使用逻辑和其他可用的数组函数
`$result = array();
$start_date=array();
foreach ($arr as $ele) {
if(!in_array($ele['start_date'],$start_date)
{
$result[]=$ele;
}
$start_date[]=$ele['start_date'];
}
print_r($result); `
可能对您有帮助