Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Staattinen sorttaus

T.M. [18.07.2006 23:05:47]

#

<?php

ob_start();

print"Kirjoita tallennettavat arvot:<br>";
print"<FORM METHOD=\"POST\" ACTION=\"?act=add\">
Arvo1: <INPUT TYPE=\"text\" NAME=\"tieto[]\" maxlength=\"500\"> (max 50 merkkiä) (string)<br>
Arvo2: <INPUT TYPE=\"text\" NAME=\"tieto[]\" maxlength=\"100\"> (max 10 merkkiä) (int)<br>
Arvo3: <INPUT TYPE=\"text\" NAME=\"tieto[]\" maxlength=\"100\"> (max 10 merkkiä) (float)<br>
Arvo4: <INPUT TYPE=\"text\" NAME=\"tieto[]\" maxlength=\"50\"> (max 5 merkkiä) (int)<br>
<INPUT TYPE=\"submit\" value=\"Tallenna\"><BR>
</FORM>";

$act = $_GET['act'];


function create_static_sorted_file($tiedosto, $data, $_POST, $reverse = 0){
	$rivit = file($tiedosto);
	// Lisätään uusi rivi vanhojen jatkoksi:
	$rivit[] = generate_sorted_row($data, $_POST);
	// Järjestetään lista:
	sort($rivit);
	return $rivit;
}

function read_sorted_vals($data, $rivi){
	$alku = 0;
	$vals = array();
	foreach($data['order'] as $k => $v){
		$len = $data['limits'][$v];
		$style = $data['style'][$v];
		$type = $data['types'][$v];
		$max = $data['max'][$type];
		$val = trim(substr($rivi, $alku, $len));
		if($type != "string"){
			if($style < 0){
				$val = $max-$val;
			}
		}
		$vals[] = $val;
		$alku += $len;
	}
	return $vals;
}

function generate_sorted_row($data, $_VARS){
	$list = array();
	// Luodaan uusi tallennettava rivi tietyillä ehdoilla:
	foreach($data['order'] as $k => $v){
		$dat = $_VARS['tieto'][$v]; // Lomakkeesta tullut arvo
		$raja = $data['limits'][$v]; // Merkkijonorajoitukset
		$type = $data['types'][$v]; // Tietotyyppi

		// Tarkistetaan ettei ole merkkijono, sillä merkkijonoja
		// ei voi järjestää käänteisesti yhdellä laskutoimituksella:
		if($type != "string"){
			$maksimi = $data['max'][$type];
			// Jos numeerinen arvo on suurempi kuin maksimi, tai se on liian pitkä:
			if(strlen($dat) > $raja || $dat > $maksimi){
				$dat = $maksimi;
			}
			// Jos haluttiin kääntää numeerisen arvon järjestys toisinpäin:
			if($data['style'][$v] < 0){
				// Luodaan luvusta päinvastanen luku. Tällä tavalla saamme
				// arvon järjestymään käänteiseen järjestykseen halutessa:
				$dat = $maksimi-$dat;
			}
			// Jos uusi pituus onkin pidempi kuin merkkijonon rajoitin,
			// luodaan uusi numero joka on suurin mahdollinen arvo sille pituudelle:
			if(strlen($dat) > $raja){
				$dat = str_repeat("9", $raja);
			}
		}else{
			// Jos merkkijono on liian pitkä, katkaistaan se:
			if(strlen($dat) > $raja){
				$dat = substr($dat, 0, $raja);
			}
		}
		// Lisätään merkkijonon vasemmalle puolelle täytteeksi välilyöntejä:
		$list[] = str_pad((string)$dat, $raja, " ", STR_PAD_LEFT);
	}
	return implode("", $list);
}




// Daatta tiedot taulukon järjestämistä varten:
$data = array(
	// Missä järjestyksessä tiedot järjestetään,
	// ole tarkkana ettei tule kahta samaa arvoa, tai yksikään arvo jää pois:
	"order" => array(1, 2, 3, 0),
	// Miten tiedot järjestetään, -1 tarkoittaa että
	// arvo järjestetään käänteiseen järjestykseen:
	"style" => array(1, 1, -1, 1),
	// Merkkijonojen pituusrajoitukset jokaiselle arvolle:
	"limits" => array(50, 10, 10, 5),
	// Tietotyypit jokaiselle arvoille:
	"types" => array("string", "int", "float", "int"),
	// Maksimiarvot int, float tai bool tyypeille:
	"max" => array("int" => 2147483647, "float" => 2147483647, "bool" => 1)
);



$tiedosto = "static_sort.txt";
$filu = file($tiedosto);

foreach($filu as $rivi){
	$vals = read_sorted_vals($data, $rivi);
	print"($vals[0]) = ($vals[1]) = ($vals[2]) = ($vals[3])<br>";
}




if($act == "add"){
	// Luodaan taulukko tiedostosta joka järjestetään staattisesti:
	$rivit = create_static_sorted_file($tiedosto, $data, $_POST);

	// Tallennetaan lista, ei tarvitse järjestää joka sivunlatauksella uudestaan,
	// varoitus: w-moodi! saattaa hajottaa tiedoston jos useampi tallentaa samaan aikaan,
	// jos haluat estää tämän, täytyy sinun käyttää a-moodia tallennukseen, ja järjestää tiedosto
	// joka kerta uudestaan kun sivu ladataan:
	$save = fopen($tiedosto, "w");
	foreach($rivit as $rivi){
		fwrite($save, rtrim($rivi, "\r\n")."\n");
	}
	fclose($save);

	header("Location: static_sort.php");
}


ob_end_flush();

?>

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta