webForumDet fria alternativet

fopen, array, sortering, utskrift.

4 svar · 297 visningar · startad av NeoBlizz

NeoBlizzMedlem sedan jan. 200351 inlägg
#1

Har följande filer..

register.txt + default.php

register.txt

Andersson|Anna|20|Tjej 
Johansson|Bert|32|Kille 
Andersson|Lisa|28|Tjej 
Andresson|John|18|Kille

default.php

<?

$f = fopen("register.txt","r");
if(!$f) die("Panik, filen saknas, och kan ej öppnas!!!");

while (!feof($f))
{
	$line = fgets($f);
	$linevektor = explode("|",$line);
	
	$fullname[] = $linevektor[0].", ".$linevektor[1];
	//
	$e_namn[] = $linevektor[0];
	$f_namn[] = $linevektor[1];
	$alder[] = $linevektor[2];
	$kon[] = $linevektor[3];

}

	function QuickSort (&$fullname, $iFirst, $iLast)
	{
		$iTop = $iFirst;
		$iBottom = $iLast;
	
		$iMidValue = $fullname[($iTop+$iBottom)/2];
	
		while($iTop < $iBottom)
		{
			for(;$fullname[$iTop] < $iMidValue; $iTop++);
			for(;$fullname[$iBottom] > $iMidValue; $iBottom--);
			if($iTop <= $iBottom)
			{
				$iTemp = $fullname[$iTop];
				$fullname[$iTop] = $fullname[$iBottom];
				$fullname[$iBottom] = $iTemp;
				$iTop++;
				$iBottom--;
			}
		}
		if ($iTop < $iLast)
		{
			QuickSort($fullname, $iTop, $iLast);
		}
		if ($iBottom > $iFirst)
		{
			QuickSort($fullname, $iFirst, $iBottom);
		}
	}

QuickSort ($fullname, 0, count($fullname)-1);

	
	for ($p = 0; $p < count($fullname); $p++)
	{
		echo "Sorterad: ".$fullname[$p]."<br><br>";
	}
	
?>

Det jag behöver göra är att nu efter att sorteringen är klar få in alla 4 "uppgifter" i samma array igen..

Före sortering: "Andersson|Lisa|28|Tjej" array [2]...

Efter sorteringen: "Andersson|Lisa" array [1]...

Ändrad ordning pga sortering, och de övriga ålder + kön har inte fått den nya arrayens nummer (för sortering skall enbart ske på efternamn + förnamn).

Någon som vet hur jag ska fixa så ålder + kön till varje person kommer in i rätt array efter sorteringen?

MatteMedlem sedan aug. 20002 970 inlägg
#2

Varför överhuvudtaget splitta arrayen i fyra arrayer, istället för att köra sorteringen mot den kompletta arrayen ?

Varför ha en egen funktion när det finns inbyggt i PHP ?

$content = file('register.txt');

for ($i=0; $i<sizeof($content); $i++) {
   $content[$i] = explode("|", rtrim($content[$i]));
}

function cmp($a, $b) {

    if ($a[0] != $b[0]) {
       return ($a[0] < $b[0]) ? -1 : 1;
    } else {
       if ($a[1] == $b[1]) {
          return 0;
       } else {
          return ($a[1] < $b[1]) ? -1 : 1;
       }
    
    }

}

usort($content, 'cmp');

// Endast för att i exemplet visa sorterad array
echo "<pre>";
print_r($content);
echo "</pre>";
NeoBlizzMedlem sedan jan. 200351 inlägg
#3

Hehe.. ingen gillar egna funktioner.

Splittar för det ska enbart sorteras på efternamn + förnamn.. men visst man kanske kan splitta efter sorteringen...(man ska kunna redigera och skriva tillbaka i filen sedan, även navigera mellan posterna, eller ta bort en post helt (sparas i filen)

Jo, Anledningen till egna funktioner är att jag MÅSTE köra den där sorteringen. (det ingår i uppgiften) ett projekt som lämnas in och betygsättas.

Börjar dock ana varför läraren vill evi skulle skriva egna funktioner, ingen på forumen vill skriva egna,. alla börjar tjata om de inbyggda, då blir det svårare att få hjälp.

MatteMedlem sedan aug. 20002 970 inlägg
#4

Håll dig till en styck array, en tvådimensionell sådan.
Se exemplet där jag skapade arrayen $content.

Sedan kan du använda din quicksort-funktion (något omarbetad) för att sortera i den arryen. Resultatet kommer att bli detsamma som i mitt exempel.

Nu känns det väldigt tveksamt att slänga upp koden för det, då det tydligen är en skoluppgift.

Några tips dock.

1. För att visualisera vilken array du arbetar mot kan du byta namn på $fullname till $content på alla ställen.

2. Ditt $fullname motsvaras i den tvådimensionella arrayen av $content[--radnr--][0].', '.$content[--radnr--][1], t.ex $content[$iTop][0].', '.$content[$iTop][1].
Använd detta för din jämförelse.

Sedan när sorteringen är gjord är det en baggis att loopa igenom arrayen, packa ihop raderna med implode och skriva till fil.

NeoBlizzMedlem sedan jan. 200351 inlägg
#5

Tackar, dina tips hjälpte...

Lyckades få det att fungera.. :birp

Genererad på 375 ms · cache AV · v20260730165559-full.f96bc7eb