най-близкия по стойност ключ

  • Автор Автор ivzb
  • Начална дата Начална дата

ivzb

Registered
здравейте, имам следния проблем: имам масив с разни цифри за ключове. Имам и произволно число, на което трябва да намеря най-близкия до числото по стойност ключ в масива. Аз се сещам само да почна едновременно да намалявам и увеличавам числото и първия ключ който съществува това ще е, ама няма ли по-добро решение? Идеи?
 
Пробвай jтова ако съм те разбрал правилно:
PHP:
<?php 
$masiv = array(4, 16, 10, 90, 43, 71, 18, 13);
$cifra = 17;
if(in_array($cifra,$masiv))
{
echo "$cifra |";
}
else
{
sort ($masiv);
foreach($masiv AS $val)
{
	if($cifra > $val)
	{
		$min = $val;
	}
	else if($cifra < $val)
	{
		$max = $val;
	}
}
echo "Min - $min | Max - $max";
}
?>
 
Ето как стана :)

PHP:
$arr = array('1'=>'v','2'=>'v','23'=>'v','456'=>'v','2212'=>'v','311'=>'v','55'=>'v','4'=>'v','8'=>'v');
$num = 76; // произволното число
$equal = false;
foreach($arr as $key=>$value) {
        
        $sub = $num - $key;
        if($sub == 0) {
                $equal = true;
                $the_key = $key;
                break;  
        }
        if(strpos($sub,'-') !== false)  $sub = $sub * (-1);     
        if(isset($min)) {
                
                if($min > $sub) {
                        
                        $min = $sub;
                        $the_key = $key;
                }
                
        }
        else {
                
                $min = $sub;
                $the_key = $key;
        }
        
}
echo ($equal ? 'Има ключ със същата стойност равна на ' : 'Най-близката ключова стойност е: ').$the_key;
 
ivzb каза:
Ето как стана :)

PHP:
$arr = array('1'=>'v','2'=>'v','23'=>'v','456'=>'v','2212'=>'v','311'=>'v','55'=>'v','4'=>'v','8'=>'v');
$num = 76; // произволното число
$equal = false;
foreach($arr as $key=>$value) {
        
        $sub = $num - $key;
        if($sub == 0) {
                $equal = true;
                $the_key = $key;
                break;  
        }
        if(strpos($sub,'-') !== false)  $sub = $sub * (-1);     
        if(isset($min)) {
                
                if($min > $sub) {
                        
                        $min = $sub;
                        $the_key = $key;
                }
                
        }
        else {
                
                $min = $sub;
                $the_key = $key;
        }
        
}
echo ($equal ? 'Има ключ със същата стойност равна на ' : 'Най-близката ключова стойност е: ').$the_key;

Ако не се мъчиш да практикуваш алгоритмичното си мислене, то за тази цел по-добре използвай levenshtein()
 
Eто ти и този вариант, за мен е по-лесен нооо ти си решаваш :)
PHP:
<?php 
$masiv = array(1,4, 16, 10, 90, 43, 71, 18, 13, 91);
$cifra = 27;
if(in_array($cifra,$masiv))
{
echo "$cifra <br>";
}
else
{
	sort($masiv);
	foreach($masiv AS $val)
	{
		if($cifra > $val)
		{
			$min = $val;
		}
	}
	arsort($masiv);
	foreach($masiv AS $val2)
	{
		if($cifra < $val2)
		{
			$max = $val2;
		}
	}
	$raz=$cifra - $min;
	$sum=$max-$cifra;
	if($raz > $sum)
	{
		echo "Min - $min<br>";
	}
	if($raz < $sum)
	{
		echo "Max - $max<br>";
	}
	if($raz == $sum)
	{
		echo "Min - $min | Max - $max<br>";
	}
}

?>
 
dakata__92 каза:
Eто ти и този вариант, за мен е по-лесен нооо ти си решаваш :)
...

Твърде много са проверките, може да се оптимизира повече.
 
TryMe каза:
dakata__92 каза:
Eто ти и този вариант, за мен е по-лесен нооо ти си решаваш :)
...

Твърде много са проверките, може да се оптимизира повече.
Почти същото е просто завъртам двапъти масива подреден по възходящ и нисходящ ред :) А и винаги може да си го смали автора ако има желанието изобщо да го ползва :P
 
index каза:
http://php.net/manual/en/function.array-keys.php

http://php.net/manual/bg/function.range.php

Това хубаво, обаче не може да се определи най-близката стойност, ако търсеният ключ го няма.


levenshtein е най-подходящ за тази цел. Изчислява дистанцията по еднаквост на думи.
 
PHP:
<?php

function findClosest($match, $array) {

  $i = $match;
  $j = $match;

  $max = max(array_keys($array));
  $min = min(array_keys($array));

  while(1) {
   if($i<$min && $j>$max) {
      return false;
   }

    if(isset($array[$i])) {
      return $i;
    }

    if(isset($array[$j])) {
      return $j;
    }


    
    $i--;
    $j++;
  }

  return false;
}


$array = array(1=>'wef', 20 => 'wqdqwdw', 2 => 'ergre', 45 => 'qwdwq');

$res = findClosest(30, $array);

if($res) {
    echo "Nai-blizko e: " . $res;
} else {
   echo "Nqma nameren rezultat";
}
 

Back
Горе