2014-04-15 47 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