在具有ID的多维数组中获得最高日期

时间:2019-07-15 10:34:26

标签: php arrays multidimensional-array

在子数组具有相似的id的情况下,我只想选择日期最高的那些。

$array = [
           ['id' => 10, 'date' => '10-24-1994'],
           ['id' => 10, 'date' => '10-24-1996'],
           ['id' => 10, 'date' => '10-24-1997'],
           ['id' => 10, 'date' => '10-24-1998'],
           ['id' => 9, 'date' => '10-24-1998'],
           ['id' => 9, 'date' => '10-24-2001'],
           ['id' => 9, 'date' => '10-24-1997'],
           ['id' => 8, 'date' => '10-24-1996'],
           ['id' => 10, 'date' => '10-24-1999'],
           ['id' => 10, 'date' => '10-24-1991'],
           ['id' => 10, 'date' => '10-24-1993'],
           ['id' => 8, 'date' => '10-24-2001']
         ]; /* array i have */

$expected_Result = [
                     ['id' => 10, 'date' => '10-24-1999'],
                     ['id' => 9, 'date'=> '10-24-2001'],
                     ['id' => 8, 'date' => '10-24-2001'],
                   ];
 /* array which i expected */ 

6 个答案:

答案 0 :(得分:3)

我将使用它作为解决方案,以便拥有一个键为ID本身的数组:

/** 
 * @return array<int,string> 
 */
function sortDatesUniqueById(array $list): array
{
    $result = [];

    foreach ($list as ['id' => $id, 'date' => $date]) {
        if (!isset($result[$id]) || $result[$id] < $date) {
            $result[$id] = $date;
        }
    }

    return $result;
}

或另一种方法,以准确获得您的要求:

/** 
 * @return array{id:int, date:string} 
 */
function sortDatesUniqueById(array $list): array
{
    $result = [];

    foreach ($list as ['id' => $id, 'date' => $date]) {
        if (!isset($result[$id]) || $result[$id]['date'] < $date) {
            $result[$id] = ['id' => $id, 'date' => $date];
        }
    }

    return array_values($result);
}

答案 1 :(得分:2)

仅循环遍历该数组,请检查该ID是否作为$result数组中的索引存在。如果是这样,请检查新日期是否大于当前日期-如果是,则用新值覆盖它。

$result = [];
foreach ($array as $v) {
    if (!isset($result[$v['id']])) {
        $result[$v['id']] = $v['date'];
    } elseif ($result[$v['id']] < $v['date']) {
        $result[$v['id']] = $v['date'];
    }
}

答案 2 :(得分:0)

您可以使用array_multisort(),最后使用array_walk()来使数组唯一。

array_multisort(
    array_column($array, 'id'), SORT_DESC, 
    array_column($array, 'date'), SORT_DESC, 
    $array
);

$result = [];
array_walk($array, function ($item) use (&$result) {
    !isset($result[$item['id']]) && $result[$item['id']] = $item['date'];
});

print '<pre>';
print_r($result);

答案 3 :(得分:0)

这是一支班轮,
首先按ID desc和日期asc排序。然后将键设置为id,以便其最后日期将覆盖每个小日期。然后使用array_values重置索引。

array_multisort(array_column($array, 'id'), SORT_DESC, array_column($array, 'date'), SORT_ASC, $array);
$result = array_values(array_column($array, null, "id"));
print_r($result);

array_column —从输入数组的单个列中返回值

  

注意: column_key:要返回的值列。该值可以是整数键   要检索的列的名称,也可以是   关联数组或属性名称。可能还 NULL   返回完整的数组或对象(这与   index_key以重新索引数组。

Demo

输出:-

Array
(
    [0] => Array
        (
            [id] => 10
            [date] => 10-24-1999
        )

    [1] => Array
        (
            [id] => 9
            [date] => 10-24-2001
        )

    [2] => Array
        (
            [id] => 8
            [date] => 10-24-2001
        )

)

答案 4 :(得分:0)

我们可以先按ID和日期升序对数组进行排序,然后使用array_column提取最高日期。

$array = [
    ['id' => 10, 'date' => '10-24-1994'],
    ['id' => 10, 'date' => '10-24-1996'],
    ['id' => 10, 'date' => '10-24-1997'],
    ['id' => 10, 'date' => '10-24-1998'],
    ['id' => 9, 'date' => '10-24-1998'],
    ['id' => 9, 'date' => '10-24-2001'],
    ['id' => 9, 'date' => '10-24-1997'],
    ['id' => 8, 'date' => '10-24-1996'],
    ['id' => 10, 'date' => '10-24-1999'],
    ['id' => 10, 'date' => '10-24-1991'],
    ['id' => 10, 'date' => '10-24-1993'],
    ['id' => 8, 'date' => '10-24-2001']
]; 

uasort($array, function($a, $b) {
    $r = $a['id'] <=> $b['id'];
    if($r == 0)
        return $a['date']<=>$b['date'];
    return $r;
});

var_export(array_column($array, null, 'id'));

输出:

array (
  8 => 
  array (
    'id' => 8,
    'date' => '10-24-2001',
  ),
  9 => 
  array (
    'id' => 9,
    'date' => '10-24-2001',
  ),
  10 => 
  array (
    'id' => 10,
    'date' => '10-24-1999',
  ),
)

答案 5 :(得分:0)

这是我的解决方法。

$result = [];

foreach ($array as $value) {
    if (!in_array($value['id'], array_column($result, 'id'))) {
        $result[] = $value;
    } else {
        foreach ($result as $key => $res) {
            if ($res['id'] === $value['id'] && $value['date'] < $res['date']) {
                $result[$key]['date'] = $value['date'];
            }
        }
    }
}

首先遍历每个值(如果不在列表中),将其添加到$result变量中,否则,遍历$result值并检查ID是否与当前{ {1}},最后检查到哪个日期更大。