Как найти в большом масиве значение по максимальному совпадению ключа.

Ge0SuB

Guest
Как найти в большом масиве значение по максимальному совпадению ключа.

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

$c[380] = 'Ukraine'

если искать 380 то тогда можно там echo $c['380'] получим ураину.
Но ведь можно еще искать 38044 это код киева, и для него подходит элемент масива в котором ключ 380
тоесть если искать 38044 то должно вернуть Ukraine

Как ?

-~{}~ 29.12.04 16:02:

А вот так ;)
PHP:
function getElementvalue($array,$element) 
{
	global $return;
	while(list($key,$val) = each($array)) 
	{

		if (ereg($element, $key)) 
		{
			echo $val." - ".$key."<br>";
		}
	}

return "unknown";
}
$var = getElementvalue($country,"38044");
Можно данные занести в другой масив, отсортировать и взять самое первое значение ;) Всем спасибо!

-~{}~ 29.12.04 16:02:

Это алгоритм, прошу не коментировать!

-~{}~ 29.12.04 16:05:

А вот уже рабочая версия ;)

PHP:
function getElementvalue($array,$element) 
{
	global $return;
	while(list($key,$val) = each($array)) 
	{

		if (ereg($element, $key)) 
		{
			$foundval[] = $val;
			$found = 1;
		}
	}

	if ($found == 1)
	{
		return $foundval[0];
		
	}
	else
	{
		return "unknown";
	}

}
Может есть идеи по лучше?
 

Кром

Новичок
А откуда массив берется?

>значение по максимальному совпадению ключа
>если искать 38044 то должно вернуть Ukraine

Не вижу логики. Должно вернуть Киев, как максимальное совпадение.
 

Ge0SuB

Guest
Так ведь в масиве нету ключа 38044 а есть только 380

:) Вот и логика.

Если нету конкретного значения брать максимальное совподение.
 

SiMM

Новичок
Так откуда массив берётся? Если из базы - то почему бы не делать это её средствами?
 

Ge0SuB

Guest
Вот пследняя версия которая у меня реально заработала правельно ;)

PHP:
function foundinarray($array,$element) 
{
	$ccountry = $array[$element];

	if ($ccountry) 
	{
		return $ccountry;
	}

	while(list($key,$val) = each($array)) 
	{
		if (!$element) $element="2138721389653128765123";
		if (ereg($element, $key)) 
		{
			$foundval[] = $val;
			$found = 1;
		}
	}

	if ($found == 1)
	{
		return $foundval[0];
		
	}
	else
	{
		return "unknown";
	}

}

А почему нельзя сразу в базе это делать. потому что у меня есть функция
init_country()
которая сразу делает масив значений. у меня может быть 1000 проверок по коду, и что делать 1000 запросов? ;)
 

Stm

Новичок
PHP:
$a['380']='Ukraine';

	function find($a,$k){
		for($mk=$k;$mk;$mk=substr($mk,0,strlen($mk)-1))
			if(isset($a[$mk]))
				return $a[$mk];
		return false;
	}

	echo find($a,'38044');
 

SiMM

Новичок
Автор оригинала: Ge0SuB
А почему нельзя сразу в базе это делать. потому что у меня есть функция
init_country()
которая сразу делает масив значений. у меня может быть 1000 проверок по коду, и что делать 1000 запросов? ;)
Не вижу связи (1000 проверок/1000 запросов). И всё же правильнее наверняка решать проблему именно средствами SQL - да только не зная задачи утверждать это бессмысленно.
 

[DAN]

Старожил PHPClub
Народ, не в том русле мыслите ))

PHP:
while(empty($country[$code]) && strlen($code)){
	$code	= substr($code, 0, -1);
}
Быстро и вкусно =)

PS. и че это народ к телефонии потянуло ?

-~{}~ 29.12.04 18:17:

SiMM, sql в этом случае не панацея. Тормоза еще те, поверь. PHP с его "слабой типизацией" быстрее отрабатывает задачу.
 

SiMM

Новичок
[DAN], а я не говорю, что это панацея - я говорю, что задача не описана, чтобы говорить об оптимальности того или иного способа решения ;)
 

[DAN]

Старожил PHPClub
SiMM, ну у меня просто по этому вопросу есть глубокое телепатическое ощущение =)
Им и поделился.
 
Сверху