2016-12-05 37 views
1

这篇文章可能有道理,也可能没有道理,但我会尽力将其解释为我的能力最强。抓取密钥,最接近数组的值

因此,假设我们有一个用户EXP值为30。现在

$level = array(
    '1' => '0', '2' => '6', '3' => '13', '4' => '21', '5' => '29', '6' => '37', '7' => '46', '8' => '56', '9' => '66', '10' => '76', '11' => '87', '12' => '99', '13' => '111', '14' => '124', '15' => '138', '16' => '153', '17' => '168', '18' => '184', '19' => '201', '20' => '219', '21' => '238', '22' => '258', '23' => '279', '24' => '301', '25' => '325', '26' => '349', '27' => '376', '28' => '403', '29' => '432', '30' => '463', '31' => '495', '32' => '529', '33' => '565', '34' => '602', '35' => '642', '36' => '684', '37' => '729', '38' => '775', '39' => '824', '40' => '876', '41' => '931', '42' => '989', '43' => '1049', '44' => '1114', '45' => '1181', '46' => '1252', '47' => '1328', '48' => '1407', '49' => '1490', '50' => '1578', '51' => '1671', '52' => '1769', '53' => '1872', '54' => '1981', '55' => '2096', '56' => '2217', '57' => '2345', '58' => '2479', '59' => '2621', '60' => '2771', '61' => '2928', '62' => '3095', '63' => '3270', '64' => '3455', '65' => '3650', '66' => '3855', '67' => '4072', '68' => '4301', '69' => '4542', '70' => '4796', '71' => '5064', '72' => '5347', '73' => '5645', '74' => '5960', '75' => '6292', '76' => '6641', '77' => '7010', '78' => '7399', '79' => '7809', '80' => '8242', '81' => '8698', '82' => '9179', '83' => '9686', '84' => '10221', '85' => '10786', '86' => '11381', '87' => '12008', '88' => '12670', '89' => '13368', '90' => '14105', '91' => '14881', '92' => '15700', '93' => '16564', '94' => '17475', '95' => '18436', '96' => '19449', '97' => '20517', '98' => '21645', '99' => '22833' 
); 

,如果此数组中第30场。这意味着,用户级别是5级,因为29是衣柜里等级5级和6需要37 EXP。现在

,我的问题是。我怎么会做出可以返回值5级的功能这是有点是的closest功能,我已经看到了这里,但它必须返回数组的key因为这就是水平。

我真的不知道从哪里开始,我不知道这怎么可能。我想用的说法,但我不知道,我甚至会开始。

再一次,希望我解释得很好..这很难解释!

+0

是您的阵列总是排序? –

回答

0

这种简单的方法将满足您的需求:

function get_level($exp) 
{ 
    $levels = array(
    '1' => '0', '2' => '6', '3' => '13', '4' => '21', '5' => '29', '6' => '37'); // and so on 

    asort($levels); // sort array if necessary 

    $last_key=0; 

    foreach ($levels as $key => $level) { 
     if ($exp < $level) { 
      return $last_key; 
     } 
     $last_key = $key; 
    } 

    // if number is bigger than biggest level values: 
    return "Too big!"; // ...or whatever is good 4 you 
} 

测试它here

+0

这正是我需要的,非常感谢你! – TheWorstOne

0

这应该工作(以函数形式,其中$exp是EXP值和$array同级别的阵列):

function closest($exp, $array) { 
    foreach($array as $key => $value) { 
     $difference[abs($value - $exp)] = $key; // calculate the difference for each key 
    } 

    ksort($difference, SORT_NUMERIC); // sort array by key 
    $closest_key = current($difference); // get the first (= closest) key by value 
    return $closest_key; 
} 

echo closest(30, $level); 

导致:

5 

如果$level阵列停留在同样你可以将它嵌入到如下功能中:

function closest($exp) { 
    $level = array(
     '1' => '0', '2' => '6', '3' => '13', '4' => '21', '5' => '29', '6' => '37', '7' => '46', '8' => '56', '9' => '66', '10' => '76', '11' => '87', '12' => '99', '13' => '111', '14' => '124', '15' => '138', '16' => '153', '17' => '168', '18' => '184', '19' => '201', '20' => '219', '21' => '238', '22' => '258', '23' => '279', '24' => '301', '25' => '325', '26' => '349', '27' => '376', '28' => '403', '29' => '432', '30' => '463', '31' => '495', '32' => '529', '33' => '565', '34' => '602', '35' => '642', '36' => '684', '37' => '729', '38' => '775', '39' => '824', '40' => '876', '41' => '931', '42' => '989', '43' => '1049', '44' => '1114', '45' => '1181', '46' => '1252', '47' => '1328', '48' => '1407', '49' => '1490', '50' => '1578', '51' => '1671', '52' => '1769', '53' => '1872', '54' => '1981', '55' => '2096', '56' => '2217', '57' => '2345', '58' => '2479', '59' => '2621', '60' => '2771', '61' => '2928', '62' => '3095', '63' => '3270', '64' => '3455', '65' => '3650', '66' => '3855', '67' => '4072', '68' => '4301', '69' => '4542', '70' => '4796', '71' => '5064', '72' => '5347', '73' => '5645', '74' => '5960', '75' => '6292', '76' => '6641', '77' => '7010', '78' => '7399', '79' => '7809', '80' => '8242', '81' => '8698', '82' => '9179', '83' => '9686', '84' => '10221', '85' => '10786', '86' => '11381', '87' => '12008', '88' => '12670', '89' => '13368', '90' => '14105', '91' => '14881', '92' => '15700', '93' => '16564', '94' => '17475', '95' => '18436', '96' => '19449', '97' => '20517', '98' => '21645', '99' => '22833' 
    ); 

    foreach($level as $key => $value) { 
     $difference[abs($value - $exp)] = $key; // calculate the difference for each key 
    } 

    ksort($difference, SORT_NUMERIC); // sort array by key 
    $closest_key = current($difference); // get the first (= closest) key by value 
    return $closest_key; 
} 
0

如果我理解这是正确的,你可以试试下面的(C语言): (假设你正在匹配30)

int your_exp = 30; 
int i, array_length = 6; 
int EXP[] = {0, 6, 13, 21, 29, 37}; 
for(i=0; i<=array_length - 1; i++) 
{ 
    if(EXP[i] >= your_exp) 
     printf("Your level is: %d", i); 
} 
0

你可以做到这一点递归像这样:

function getClosest($level, $input, $index) 
{ 
    $index++; 
    if($index == count($level)) 
     return $index; 
    if($input < $level[$index+1] && $input >= $level[$index]) 
     return $index; 
    return getClosest($level, $input, $index); 
} 

,你会打电话这样说:

echo getClosest($level, 13554, 0); //prints 89 
1
function getClosest($search, $arr) 
{ 
    $closest = null; 
    $level = null; 
    foreach ($arr as $key => $item) { 
     if ($closest === null || abs($search - $closest) > abs($item - $search)) { 
      $closest = $item; 
      $level = $key; 
     } 
    } 
    return $level; 
} 

$level = array(
    '1' => '0', '2' => '6', '3' => '13', '4' => '21', '5' => '29', '6' => '37', '7' => '46', '8' => '56', '9' => '66', '10' => '76', '11' => '87', '12' => '99', '13' => '111', '14' => '124', '15' => '138', '16' => '153', '17' => '168', '18' => '184', '19' => '201', '20' => '219', '21' => '238', '22' => '258', '23' => '279', '24' => '301', '25' => '325', '26' => '349', '27' => '376', '28' => '403', '29' => '432', '30' => '463', '31' => '495', '32' => '529', '33' => '565', '34' => '602', '35' => '642', '36' => '684', '37' => '729', '38' => '775', '39' => '824', '40' => '876', '41' => '931', '42' => '989', '43' => '1049', '44' => '1114', '45' => '1181', '46' => '1252', '47' => '1328', '48' => '1407', '49' => '1490', '50' => '1578', '51' => '1671', '52' => '1769', '53' => '1872', '54' => '1981', '55' => '2096', '56' => '2217', '57' => '2345', '58' => '2479', '59' => '2621', '60' => '2771', '61' => '2928', '62' => '3095', '63' => '3270', '64' => '3455', '65' => '3650', '66' => '3855', '67' => '4072', '68' => '4301', '69' => '4542', '70' => '4796', '71' => '5064', '72' => '5347', '73' => '5645', '74' => '5960', '75' => '6292', '76' => '6641', '77' => '7010', '78' => '7399', '79' => '7809', '80' => '8242', '81' => '8698', '82' => '9179', '83' => '9686', '84' => '10221', '85' => '10786', '86' => '11381', '87' => '12008', '88' => '12670', '89' => '13368', '90' => '14105', '91' => '14881', '92' => '15700', '93' => '16564', '94' => '17475', '95' => '18436', '96' => '19449', '97' => '20517', '98' => '21645', '99' => '22833', 
); 

echo getClosest(30, $level); 

WORKING DEMO