Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Arraystä PHP-koodi

hmmp [19.09.2006 00:02:26]

#

Funktio palauttaa annetusta arraystä PHP-koodin, jossa on kyseinen array.

Mitäkö järkeä? :-) Yksinään tällä ei varmasti tee mitään, mutta funktion palauttaman koodin voi esim. kirjoittaa tiedostoon. Eli tämän avulla voit vaikkapa tallentaa hienon PHP-ohjelmasi asetukset suoraan PHP-tiedostoksi. Ainakin itselleni erittäin hyödyllinen.

Olkoon samalla esimerkkinä myös rekursiivisesta funktiosta.

<?php

// Esimerkki-array
$esimerkki[] = array("arvo0");
$esimerkki[] = array("arvo1","arvo2");
$esimerkki[] = array("avain1" => "arvo3", "avain2" => "arvo4");
$esimerkki[] = array("arvo5",array("arvo6","arvo7"));

// Pomo
function createArray($array, $name)
{
	if (!is_array($array) or $name == "")
		return false;

	$php = "<?php \n\n";

	foreach ($array as $key => $value)
	{
		$php .= "\${$name}[$key] = ";

		if (is_array($value))
			$php .= createSubArray($value);
		else
			$php .= "\"$value\"; \n";

		$php .= ";\n";
	}

	$php .= "\n?>";

	return $php;
}

// Orja
function createSubArray($array)
{

	$laskuri = 0;

	$php = "array(";

	foreach ($array as $key => $value)
	{
		if ($laskuri > 0)
			$php .= ", ";

		if ($key != "" and is_numeric($key) or $key == "")
			$php .= "$key => ";
		elseif ($key != "" and is_string($key))
			$php .= "\"$key\" => ";

		if (is_array($value))
			$php .= createSubArray($value);
		else
			$php .= "\"$value\"";

		$laskuri++;
	}

	$php .= ")";

	return $php;
}


// Käyttöesimerkki
print createArray($esimerkki, "esimerkki");

?>

odys [18.10.2006 15:20:04]

#

Mielestäni helpoin tyyli esimerkiksi tallentaa array tiedostoon on käyttää serialize()-funktiota, jolloin muuttujien tietotyypit säilyvät. Kaikessa yksinkertaisuudessaan:

<?php
    function tallenna($array, $tiedosto) {
        $file = fopen($tiedosto, "w");
        fputs($file, serialize($array));
        fclose($file);
    }
    function hae($tiedosto) {
        return unserialize(file_get_contents($tiedosto));
    }
    $taulu = array("moi", "jee", 2 => array("hee", "haa"), 3);
    tallenna($taulu, "taulu.txt");
    $haettu_taulu = hae("taulu.txt");
    print_r($haettu_taulu);
?>

Näin arrayt säilyvät tallessa tiedostoissa, joista ne voidaan aina hakea käyttöön vaivattomasti.

T.M. [18.10.2006 19:14:05]

#

Helpoin?
No ei nyt sentään.

Paljon helpommin noita arraytä voi muokata käsin, kuin tuota serialize dataa.

Itsekin käytän arraytä tallennusvälineenä, turhaan mitään serializee tms systeemiä käyttää, kun homma hoituu arraylläkin yhtä hyvin, ja vieläpä nopeiten.

tkarkkainen [19.10.2006 16:27:02]

#

Missasinko nyt jotain, vai onko tämä vain kotikutoinen ratkaisu tehdä sama kuin sisäänrakennettu funktio print_r() tekee?

Muoksista: Tai ehkä pikemminkin var_export()

arcatan [21.10.2006 15:43:10]

#

Tämä koodi on sikälikin vaarallinen, että se ei eskeipaa arvoja mitenkään. Niinpä on vihamielinen käyttäjä voisi onnistua ujuttamaan joukkoon omia komentojaan.

Esimerkki:

createArray("\"; mkdir(\"leet\")", "esimerkki");

Syntyy koodi:

<?php

$esimerkki[0] = array(0 => ""); mkdir("leet");

?>

Jos tämä suoritetaan, koodi ei tuota haluttua taulukkoa vaan luo uuden hakemiston. Yhtä hyvin se voisi poistaa tiedostoja tai ties mitä. Var_export pikaisella testauksella selviää vastaavasta.

hmmp [27.01.2007 16:54:03]

#

Hyviä kommentteja... kiitos vain.

Mutta ei, tämä ei tee samaa kuin print_r-funktio. Tämä tekee arraylle PHP-lähdekoodin. Var_export() osuu aika nappiin - kiitos vinkistä. :-)

Joissakin tilanteissa tämä on erittäin hyödyllinen, kun yhdistää tiedostoon tallentamiseen. Esim. jos joudut ohjelmassasi muodostamaan kerta toisensa jälkeen järettömän ison rekursiivisen arrayn tietokannassa olevista tiedoista, niin käy nopeammaksi tallentaa se tiedostoon ja hakea uudestaan kannasta vain kun on pakko (eli kun on tullut muutoksia).

Myönnän, että tänne postaamani versio oli melko alkeellisessa vaiheessa ja buginen. Hioin tuosta myöhemmin itselleni paremman version, mutta en nyt valitettavasti jaksaa sitä kaivaa lähdekoodien joukoista ja postata tänne. Jokainen tällaista tarvitseva siis etsiköön ja korjatkoon virheet itse - sillä tavallahan sitä oppii. ;-)

Vastaus

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

Tietoa sivustosta