簡體   English   中英

在數組中找到最大值和父值

[英]Find the maximum and parent value in an array

我搜索了很多線程,但是找不到這個解決方案,我有這個數組

Array 
( [0] => [1] => Array ( [0] => 2019-01-11T23:30:00CET [1] => -12.6 ) [2] => [3] => Array ( [0] => 2019-01-11T23:20:00CET [1] => -12.5 ) [4] => [5] => Array ( [0] => 2019-01-11T23:10:00CET [1] => -12.6 ) [10] => [11] => Array ( [0] => 2019-01-11T22:40:00CET [1] => -12.4 ) 

我發現此數組具有最大值或最小值(列[1]),但我需要找到相對的Parent

(例如,最低-12.6在[1] [0]中作為2019-01-11T22:20:00CET)在第一列(Column [0])中顯示的這兩個值

謝謝

如果使用array_column()提取數據的第二列,則可以對該數組使用min()max()來選擇所需的數據。 此代碼然后提取匹配所使用的那些foreach()if來檢查它是否匹配(不完全確定要作為輸出什么,但這應該幫助)...

$source = [["2019-01-11T23:30:00CET", -12.6],
    ["2019-01-11T23:20:00CET", -12.5],
    ["2019-01-11T23:10:00CET", -12.6]
];

$extract = min(array_column($source, 1));  // or use max()
$output = [];
foreach ($source as $key => $element) {
    if ( $element[1] == $extract )  {
        // Matches, so add to output
        $output[$key] = $element[0];
    }
}
print_r($output);

會給

Array
(
    [0] => 2019-01-11T23:30:00CET
    [2] => 2019-01-11T23:10:00CET
)

您可以使用array_filter()提取匹配的行,但是foreach()足以滿足此類簡單要求(IMHO)。

如果value列中可能有空白值或字符串,則這可能會使min()感到困惑,因為它將考慮這些值並將它們作為字符串進行比較,以確保將它們全部作為數字進行比較,您可以添加...

$values = array_map("floatval", array_column($source, 1));
$extract = min($values);  // or use max()

array_map("floatval",...瀏覽列表,並將它們全部轉換為浮點值。

另外,這是用於“在某個數組中找到最大值”的通用算法草圖,表示為偽代碼:

  • 如果數組為空,則“安靜地離開”,否則拋出異常。
  • 否則,假設數組中的第一個元素最大的元素。
  • 現在,遍歷其余元素,測試每個元素實際上是否大於您到目前為止所擁有的“最大元素”。 如果是這樣,請將其選擇為“最大”。
  • 循環結束后,返回您的答案。

現在,這就是極客所稱的“ O(n)算法”,也就是說,其執行時間將“約為”數組中元素的數量。 好吧,如果這是“一次性”要求,那就很好。 而如果您實際想要做的是獲得“多個” max元素,則對數組進行排序(一次,然后保留排序的結果...)會變得明顯更好,因為排序將是O( log(n)) ...“以元素數量的一些對數的順序”,以及隨后從該排序數組中“彈出”元素的成本不再存在。

當然,還有其他方法可以做到這一點-樹木之類-但我在這里已經太遲了。

暫無
暫無

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

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