我有以下数组:
$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的观点,您肯定可以省去通过标识符对值进行分组的中间步骤。
您只需要迭代原始输入数组并确定:
- 如果每个子集包含第一次出现的"0";标识符";(行中的第一个值)OR
- 如果它不是第一次出现,请检查它是否大于先前存储的值
代码:(演示)
$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,
),
)