以自定义形式转换多维数组

时间:2018-10-14 12:28:52

标签: 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',
    '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()和数字格式参数,但是还没有成功。感谢帮助。提前谢谢。

3 个答案:

答案 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); `

可能对您有帮助