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',
  ),
)