按一列对数据行进行分组,然后在每组中的另一列中查找最大值


Group rows of data by one column and find max value in another column within each group

我有以下数组:

$array = [
    [2000, 401],
    [2000, 317],
    [2000, 301],
    [2002, 285],
    [2002, 277],
    [2002, 271],
    [2001, 208],
    [2001, 263],
    [2002, 285],
    [2001, 262],
    [2000, 258]
]

然后我写了以下代码来对其值进行分组:

$result06 = array();
foreach ($chart06 as $el) {
    if (!array_key_exists($el[0], $result06)) {
        $result06[$el[0]] = array();
    }
    $result06[$el[0]][] = $el[1];
}

据此,我们收到以下结果:

Array
(
[2000] => Array
    (
        [0] => 401
        [1] => 317
        [2] => 301
        [3] => 258
    )
[2002] => Array
    (
        [0] => 285
        [1] => 277
        [2] => 271
    )
[2001] => Array
    (
        [0] => 208
        [1] => 263
        [2] => 262
    )
)

现在我如何确定每个子阵列的最大值并将其变换为"0";扁平的";数组是否如下所示?

Array
(
[2000] => 401
[2002] => 285
[2001] => 263
)

我试过这个:

foreach ($result06 as $value){
    $resultMax[] = max($value);
}

但结果是:

Array
(
[0] => 401
[1] => 285
[2] => 263
)

但我真的需要原来的钥匙是一样的。

您可以在foreach循环中获得密钥,如下所示:

foreach ($result06 as $key => $value){
    $resultMax[$key] = max($value);
}

只在第一位插入最大值:

foreach ($chart06 as $el) {
    if (!array_key_exists($el[0], $result06)) {
        $result06[$el[0]] = $el1;
    } else {
        $result06[$el[0]] = max($result06[$el[0]], $el[1]);
    }
}

跳过创建分组数组的中间步骤:

$result06 = array();
foreach ($chart06 as $el) {
    if (!isset($result06[$el[0]])) {
        $result06[$el[0]] = 0;
    }
    $result06[$el[0]] += el[1];
}

我同意AbraCadaver的观点,您肯定可以省去通过标识符对值进行分组的中间步骤。

您只需要迭代原始输入数组并确定:

  1. 如果每个子集包含第一次出现的"0";标识符";(行中的第一个值)OR
  2. 如果它不是第一次出现,请检查它是否大于先前存储的值

代码:(演示)

$array = [
    [2000, 401],
    [2000, 317],
    [2000, 301],
    [2002, 285],
    [2002, 277],
    [2002, 271],
    [2001, 208],
    [2001, 263],
    [2002, 285],
    [2001, 262],
    [2000, 258]
];
foreach ($array as $row) {
    $id = $row[0];                                         // just to improve readability
    if (!isset($result[$id]) || $result[$id] < $row[1]) {  // first occurrence or less than current
        $result[$id] = $row[1];                            // store the current value
    }
}
var_export($result);

输出:

array (
  2000 => 401,
  2002 => 285,
  2001 => 263,
)

或者,如果你想保留完整的行,你可以这样调整:(演示)

$result = [];
foreach ($array as $row) {
    $id = $row[0];                                            // just to improve readability
    if (!isset($result[$id]) || $result[$id][1] < $row[1]) {  // first occurrence or less than current
        $result[$id] = $row;                                  // store the current value
    }
}
var_export(array_values($result));

输出:

array (
  0 => 
  array (
    0 => 2000,
    1 => 401,
  ),
  1 => 
  array (
    0 => 2002,
    1 => 285,
  ),
  2 => 
  array (
    0 => 2001,
    1 => 263,
  ),
)