PHP: Speichern und Lesen von Daten: Arrays in und aus Dateien

Die Frage wie man mit PHP Daten speichern kann stellt sich recht oft. Die Standardauskunft läuft oft auf Datenbank oder (csv-)Dateien hinaus. Das man aber sogar Arrays praktisch direkt einlesen und speichern kann ist besonders Anfängern oft nicht bekannt, Dabei klappt das mit der direkten Speicherung von Arrays und auch Hashes sehr gut:

<?php
	#
	## main
	#

	// Beispielarray:
	$arArray = array (1, 2, array ("a", "b", "c"));
	$arArray['foo']='bar';
	$arArray['bar']='foo';


	// Funktionsaufruf zum Schreiben
	File_Put_Array('test.data', $arArray) or die ("Fatal: Das Array konnte nicht in Datei test.data gespeichert werden.\n");

	// Nur für das Beispiel:
	print "Das Speichern hat geklappt, TestArray wird gelöscht.\n";
	unset ($arArray);

	//  Funktionsaufruf zum Lesen:
	$arArray=File_Get_Array('test.data');

	var_dump ($arArray);
	print "\n"; exit;

	#
	## functions
	#

	function File_Put_Array($FileName, $ar) {
	    return file_put_contents($FileName , '<?php $ar=' . var_export($ar, true) . ';');
	}

	function File_Get_Array($FileName) {
	    include $FileName;
	    return $ar;
	}
?>

Aber man kann diese Daten auch serialisieren:

<?php
	#
	## main
	#

	// Beispielarray:
	$arArray = array (1, 2, array ("a", "b", "c"));
	$arArray['foo']='bar';
	$arArray['bar']='foo';


	// Funktionsaufruf zum Schreiben
	File_Put_Array_Serialized('test.data', $arArray) or die ("Fatal: Das Array konnte nicht in Datei test.data gespeichert werden.\n");

	// Nur für das Beispiel:
	print "Speichern hat geklappt, TestArray wird gelöscht.\n";
	unset ($arArray);

	//  Funktionsaufruf zum Lesen:
	$arArray=File_Get_Array_Serialized('test.data');

	var_dump ($arArray);
	print "\n"; exit;

	#
	## functions
	#

	function File_Put_Array_Serialized($FileName, $ar) {
	    return file_put_contents($FileName, serialize($ar));
	}

	function File_Get_Array_Serialized($FileName) {
	    if (! is_file($FileName)) { die ("Fatal: Die Datei $FileName gibt es nicht."); }
	    if (! is_readable($FileName)) { die ("Fatal: Die Datei $FileName ist nicht lesbar."); }
	    return unserialize(file_get_contents($FileName));
	}
?>

Größere Datenmengen können hierbei sogar noch mit bzcompress oder gzcompress (Voraussetzung: installierte zlib - diese sollte aber bei den meisten PHP-Installationen erfüllt sein) komprimiert werden. Das Beispiel mit zlib und gzcompress und serialiserten Daten:

<?php
	#
	## main
	#

	// Beispielarray:
	$arArray = array (1, 2, array ("a", "b", "c"));
	$arArray['foo']='bar';
	$arArray['bar']='foo';

	// Funktionsaufruf zum Schreiben
	File_Put_Array_Serialized_Compressed('test.data', $arArray) or die ("Fatal: Das Array konnte nicht in Datei test.data gespeichert werden.\n");

	// Nur für das Beispiel:
	print "Das Speichern hat geklappt, TestArray wird gelöscht.\n";
	unset ($arArray);

	//  Funktionsaufruf zum Lesen:
	$arArray=File_Get_Array_Serialized_Compressed('test.data');

	var_dump ($arArray);
	print "\n"; exit;

	#
	## functions
	#

	function File_Put_Array_Serialized_Compressed($FileName, $ar) {
	    return file_put_contents($FileName, gzcompress(serialize($ar)));
	}

	function File_Get_Array_Serialized_Compressed($FileName) {
	    if (! is_file($FileName)) { die ("Fatal: Die Datei $FileName gibt es nicht."); }
	    if (! is_readable($FileName)) { die ("Fatal: Die Datei $FileName ist nicht lesbar."); }
	    return unserialize(gzuncompress(file_get_contents($FileName)));
	}
?>

Anwendungsübergreifend lässt sich der Inhalt eines Arrays auch im JSON-Format speichern. Diese Lösung wird gleich mit und ohne Kompression vorgestellt:

<?php
	#
	## main
	#

	// Beispielarray:
	$arArray = array (1, 2, array ("a", "b", "c"));
	$arArray['bar']='barfus';
	$arArray['foo']='bigfoot';
        // Zippen oder nicht?
        $bolZipThis=true;

	// Funktionsaufruf zum Schreiben
	File_Put_Array_As_JSON('test.data', $arArray, $bolZipThis) or die ("Fatal: Das Array konnte nicht in Datei test.data gespeichert werden.\n");

	// Nur für das Beispiel:
	print "Das Speichern hat geklappt, TestArray wird gelöscht.\n";
	unset ($arArray);

	//  Funktionsaufruf zum Lesen:
	$arArray=File_Get_Array_From_JSON('test.data', $bolZipThis);

	var_dump ($arArray);
	print "\n"; exit;

	#
	## functions
	#

	function File_Put_Array_As_JSON($FileName, $ar, $zip=false) {
	    if (! $zip) {
		return file_put_contents($FileName, json_encode($ar));
            } else {
		return file_put_contents($FileName, gzcompress(json_encode($ar)));
            }
	}

	function File_Get_Array_From_JSON($FileName, $zip=false) {
	    if (! is_file($FileName))     { die ("Fatal: Die Datei $FileName gibt es nicht."); }
	    if (! is_readable($FileName)) { die ("Fatal: Die Datei $FileName ist nicht lesbar."); }
            if (! $zip) {
		return json_decode(file_get_contents($FileName), true);
            } else {
		return json_decode(gzuncompress(file_get_contents($FileName)), true);
	    }
	}
?>

Weitere Informationen in diesem Bereich: