webForumDet fria alternativet

Sortera array

3 svar · 406 visningar · startad av fiddler

fiddlerMedlem sedan juli 20023 617 inlägg
#1

Jag går bet på ett sorteringsproblem och hoppas på att någon av er gjort något liknande. :)

Jag vill sortera en array efter i första hand värdena, och i andra hand efter index. Alltså i de fall det finns flera lika värden vill jag att dessa sorteras efter sitt index. Någon som kan sparka mig i rätt riktning?

jmeMedlem sedan maj 20012 237 inlägg
#2

Menar du med index, den position som elementet finns i arrayn?

I så fall räcker det väl med att du bara testar om nästa värde i arrayn är lägre, eller högre än den nuvarande? Om det är lägre så byter dessa två värden plats:

for($i = 0; $i < count($arr); $i++)

{
	if ($arr[$i+1] < $arr[$i])
	{ 
		if($i < count($arr) - 2)
		{
			$arr[i] = $tmp;
			$arr[i] = $arr[i+i];
			$arr[i+i] = $tmp;  
		}
	}
}
Dies_IraeMedlem sedan aug. 2001145 inlägg
#3

Hm,

Om jag förstod dig rätt så ville du sortera värden och sen flytta dom i själva arrayn så att även keyn blir sorterad på dom ställen där värden är lika?

Du får gärna berätta varför du vill göra de, kan nämnligen inte se någon speciell anledning :)

Typ:

<?
function super_sort(&$arr) {
	if (!is_array($arr)) return false;

	asort($arr);
	echo "Efter värdessortering:\n_________________\n";
	print_r($arr);
	
	$new_array = array();
	reset($arr);	
	while(list($id, $value) = each($arr)) {
	  
		$next_key = key($arr);
		$next_value = $arr[$next_key];

		if ($next_value == $value && $id > $next_key) {
			$new_array[$next_key] = $next_value;
			$new_array[$id] = $value;
			next($arr);
			continue;
		}
		$new_array[$id] = $value;
	}
	
	$arr = $new_array;
}

// Slumpa fram en array.
for ($a = 0; $a < 10; $a++) $arr[rand(0, 10)] = rand(0, 5);

echo "Första array:\n_________________\n";
print_r($arr);

super_sort($arr);

echo "Sista sortering:\n_________________\n";
print_r($arr);
?>

Resultat:

Första array:
_________________
Array
(
    [10] => 3
    [2] => 2
    [6] => 1
    [4] => 0
    [0] => 3
    [8] => 2
)
Efter värdessortering:
_________________
Array
(
    [4] => 0
    [6] => 1
    [8] => 2  // key 8 borde byta plats med 2an?
    [2] => 2
    [10] => 3 // 10an med 0an?
    [0] => 3
)
Sista sortering:
_________________
Array // Sorterad efter value och sen keyn?
(
    [4] => 0
    [6] => 1
    [2] => 2
    [8] => 2
    [0] => 3
    [10] => 3
)
fiddlerMedlem sedan juli 20023 617 inlägg
#4

Dies_Irae skrev:

Du får gärna berätta varför du vill göra de, kan nämnligen inte se någon speciell anledning :)

Tack för ditt svar! :)
Jag löste detta problem: http://mathschallenge.net/index.php?section=project&ref=view&id=124 men blev tvungen att sortera värdena runt 10000 manuellt för att få rätt svar.

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
132 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)