-3

我有数组

     $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(),但还没有成功。帮助表示赞赏。提前致谢。

4

3 回答 3

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改为>获得最少的天数。

于 2018-10-14T12:38:23.000 回答
1

days步骤#1:使用列值从最低到最高对数组进行排序。

usort($arr, function($a, $b){ return $a['days'] <=> $b['days'];});

*巧合的是,这一步可以避免,因为您的数据已经处于合适的顺序。

步骤#2:使用数组列为每个子数组分配关联键。通常,数组不能包含重复的键,因此较早的行会被后面的行覆盖(删除)——这会产生所需的结果。 array_values()被调用以删除临时密钥。

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',
  ),
)
于 2018-10-14T13:23:17.333 回答
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); `

可能对你有帮助

于 2018-10-14T12:42:58.613 回答