Ближайщее число в масиве к заданому

...:::Alex:::..

Новичок
Ближайщее число в масиве к заданому

Привет.
Такая табла: Скажем эсть масив:
PHP:
<?
   $a = array(0, 256, 20645, 31, 20, 86, 35, 15, 14);   
?>
Допустим в масиве я исчу способом for число допустим 32. Если найдено то выполняем одно действие,

если нет - то нужно найти максимально бриблеженные 4е числа к искомому числу.
Как это сделать?

Пример:
Исчем число 32.
Такого числа нет в масиве.
Тогда скрипт должен вывести такие числа: 31, 35, 20 и 15.
Как такое соорудить?
 

Crazy

Developer
1. Отсортировать
2. Выполнить стандартный поиск делением пополам
3. Вывести числа в обе стороны от финальной точки
 

Фанат

oncle terrible
Команда форума
...:::Alex:::..
Если у тебя не получилось - это ещё не повод бежать за помощью.
Это повод попробовать ещё раз. И ещё раз.
 

...:::Alex:::..

Новичок
Вот сижу и непойму - что такое "callback cmp_function"
Что там за значения должны быть? Начитался в примерах какие-то "cmp", "c", "a"
На остальное ругается...

Фанат знаю... сам такой, но в другом языке...
 

Sender

Новичок
Код:
$a = array(0, 256, 20645, 31, 20, 86, 35, 15, 14);  
$need_value = 32;
if( in_array( $need_value, $a ) )
{
	echo 'I in array';
}
else 
{
	$high = array();
	$low = array();
	foreach( $a as $v )	
	{
		$v < $need_value ? array_push( $low, $v ) : array_push( $high, $v );
	}
	sort( $low );
	sort( $high );
	$res = array();
	end( $low );
	array_push( $res, prev( $low ), end( $low ) );
	array_push( $res, reset( $high ), next( $high ) );
	print_r( $res );
}
 

Crazy

Developer
Sender, алгоритм неверный. Контрольный пример: 1,2,3,4,5,6,33,34,35,36,37
 

Sender

Новичок
Crazy
чувствую программировать я научился :) а вот понимать задачи нет :)

Код:
$a = array(1,2,3,4,5,6,33,34,35,36,37 );  
$need_value = 32;
if( in_array( $need_value, $a ) )
{
	echo 'I in array';
}
else 
{
	$diff = array();
	foreach( $a as $k => $v )	
	{
		$diff[$k] =  abs( $v - $need_value );
	}
	asort( $diff );
	$keys = array_keys( $diff );
	$res = array();
	array_push(
		$res,
		$a[reset( $keys )],
		$a[next( $keys )],
		$a[next( $keys )],
		$a[next( $keys )]
	);
	print_r( $res );
}

upd: прочитал выше что ты писал, я по сути твое решение реализовал, только без usort, а с usort интересно бы посмотреть как будет и сравнить...
 

Фанат

oncle terrible
Команда форума
Sender
вот ты научился, а зачем мешаешь другому?
он ведь так и не научится, и умрёт с голоду. и это будет на ТВОЕЙ совести
 

Sender

Новичок
Фанат
все в мире относительно, может я его спас от голодной смерти.
моя совесть чиста :)


я лично учился на примерах. сейчас он не знает как реализовать, если умный то в каждой строчке разберется и поймет что к чему и в след. раз уже сам все сделает, если нет... то ему вряд ли отсутствие примера поможет
 

Sender

Новичок
Фанат
+ мне хочется проверить свое решение и сравнить его с другими решениями, может они более красивы, а мое рядом не стояло.

Что посоветуешь в этом случае? без выкладывания решения как такового...
 

baev

‹°°¬•
Команда форума
Что посоветуешь в этом случае? без выкладывания решения как такового...
Я посоветую:
попросить тредстартера выложить свой вариант.
 
Сверху