簡體   English   中英

如何提取子數組的最大值並保留父數組的鍵?

[英]How to extract max value of a subarray and keep the keys of the parent array?

我有以下數組:

Array
(
[0] => Array
    (
        [0] => 2000
        [1] => 401
    )

[1] => Array
    (
        [0] => 2000
        [1] => 317
    )

[2] => Array
    (
        [0] => 2000
        [1] => 301
    )

[3] => Array
    (
        [0] => 2002
        [1] => 285
    )

[4] => Array
    (
        [0] => 2002
        [1] => 277
    )

[5] => Array
    (
        [0] => 2002
        [1] => 271
    )

[6] => Array
    (
        [0] => 2001
        [1] => 208
    )

[7] => Array
    (
        [0] => 2001
        [1] => 263
    )

[8] => Array
    (
        [0] => 2001
        [1] => 262
    )

[9] => Array
    (
        [0] => 2000
        [1] => 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
    )
)

現在,如何提取每個子數組的最大值並將其轉換為“平坦”數組,如下所示?

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);
}

跳過創建分組數組的中間步驟:

$result06 = array();

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

僅將最大值插入第一位:

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]);
    }
}

我同意AbraCadaver,您絕對可以省去通過標識符對值進行分組的中間步驟。

您只需要迭代原始輸入數組並確定:

  1. 如果每個子集包含“標識符”的首次出現(行中的第一個值),或者
  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,
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM