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"); ?>
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.
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.
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()
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:
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.
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. ;-)
Aihe on jo aika vanha, joten et voi enää vastata siihen.