Php 以自定义形式转换多维数组
我有一个数组Php 以自定义形式转换多维数组,php,multidimensional-array,duplicates,Php,Multidimensional Array,Duplicates,我有一个数组 $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'
$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',
)
);
输出:
条件:
我希望删除重复的“开始日期”,即开始日期=2018-10-12,具有最低的“天数”,并且只保留包含较高天数的日期。我尝试过使用mysql查询,但没有得到想要的输出,我也尝试过使用数值格式参数array_unique,但还没有获得任何成功。谢谢你的帮助。提前感谢。以下是如何在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);
请注意,要获得最少的天数 没有任何默认函数,因此请使用逻辑和其他可用的数组函数
`$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); `
这可能对您有所帮助。步骤1:使用“天数”列值从最低到最高对数组进行排序
usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});
代码:
最好是在SQL中执行此操作。PHP将是第二个选择。显示的输出来自mysql查询,我尝试使用子查询,但我收到的天数来自不同的列,而开始日期来自不同的列。您包含不希望得到的输出有点误导。最好更清楚地说明您想要得到什么。嗯,我不确定您真正想要的是哪种方式,因为您说这个输出是您在SQL中得到的;但是你说你的SQL返回了错误的输出。我很困惑…@PriyankaSankhala,我没有投反对票,但是你的代码没有验证天数是否是最大/最小的see问题。如果可能,请在发布答案之前始终测试你的代码。in_arr会引起问题。你的答案也可以用更好的解释。@mickmackusa:-可以接受的in_arr是由于打字错误,但任何人都可以编辑它,这不是一个大问题,因为这是固定的,我应该声明给未来的读者,in_array比isset慢,这个答案在只需要一个数组时会生成两个数组。因此,其他答案更适合此任务。请向未来的读者解释您的答案是如何工作的,删除反勾号,并改进代码段中的制表符。此外,$start_date[]应该位于if块中,因为您当前的代码正在查找数组中存储冗余数据。虽然它提供了所需的输出,但与其他答案相比,这个答案确实没有任何可取之处。
usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});
var_export(array_values(array_column($arr, null, 'start_date')));
$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',
),
)