2014-04-15 89 views
0

是否有一個用於查找等於或大於給定索引的整數鍵的單線程?爲了清楚起見,下面是我正在使用的一個數組的示例。查找下一個最高陣列鍵

array(4294967295 => 'LONGTEXT' 
    , 16777215 => 'MEDIUMTEXT' 
    , 65535  => 'TEXT' 
    , 255  => 'TINYTEXT'); 

正如您可能認識到的一樣,這些是MySQL列定義類型。假設我給出了一個整數500,我如何快速/緊湊地找到65535的下一個鍵,它映射到'TEXT'

目前,我使用foreach(因此最高值在前)迭代陣列並跟蹤最後一個鍵。但是,由於我正在處理的數組和數據類型的數量,這個函數變得臃腫起來。

+0

也許數組不爲這個 –

+0

@Dagon最佳的數據結構,那麼你會怎麼建議?我選擇了一個數組,因爲它們可以很容易地在派生類中重新定義。 – Twifty

+0

請求單線解決方案的動機是什麼? –

回答

2

這是緊湊,應該工作:如果沒有大的類型在$array足夠存在

$sizes = array_filter(array_keys($array), function($element) use ($size) { return $element >= $size; }); 
$array[array_pop($sizes)]; 

這將發出一個未定義的索引錯誤。我真的不認爲它是最佳的 - 最好的解決方案很少是最短的。

考慮使用這樣的事情,這是更強大的:

function getType(array $types, $desiredSize) { // $types should be sorted by key asc 
    foreach($array as $length => $type) { 
     if($length >= $desiredSize) { 
      return $type; 
     } 
    } 

    return null; // no type large enough 
} 

$types = array(
     4294967295 => 'LONGTEXT', 
     16777215 => 'MEDIUMTEXT', 
     65535 => 'TEXT', 
     255 => 'TINYTEXT'); 
ksort($types); // or hardcode it in asc order 

echo getType($types, 500); // TEXT 
+0

這正是我的想法。作爲一個小改進,我會將'return null;'改爲'end($ types);',所以它使用了最大的可用空間。但這可能不是OP想要的。好吧。 –

+0

嗯。不知道我是否同意'end()' - 我想這取決於OP的需求。如果沒有足夠大的類型,他們可能想要拋出一個異常,而不是僅僅使用最大可用和截斷... –

+0

這可能有效。因爲我只需要一個條目來處理缺少大小和數組的缺省值,所以在我的'switch'中調用它會容易得多。謝謝 :) – Twifty