Tom: Array zufällig ausgeben und ausgegeben Werte merken

Beitrag lesen

Hello Sinje,

nachdem Tamni so fleißig war und ich ihm Kommentare in seine Lösung geschrieben habe, kommt von mir jetzt auch noch eine, um Kommentare oder Fragen reinschreiben zu lassen.

Ich habe gleich mal ausprobiert, wie man eine aussagefähige Fehlerbehandlung aufbauen könnte.

  
<?php   ### changer.php ### Wechselnde Ausgabe ### utf-8 ### ÄÖÜäöü  
  
### only for testing  
header('Content-Type: text/html; Charset=utf-8');  
$filename = 'changer.dat';	## Dateiname für die Datendatei  
  
  
#------------------------------------------------------------------------------  
## settings  
#------------------------------------------------------------------------------  
	$MYERRORMSG = NULL;			     ## Globale Variable zur Fehlerauswertung  
	ini_set('track_errors',1);       ## Für die Fehlerbehandlung notwendig  
	$abort = ignore_user_abort(true);## Damit das File fertig geschrieben wird  
                                     ##   wenn der User vorher schlapp macht.	  
  
#------------------------------------------------------------------------------  
function get_error_msg($error_txt)  
{  
	## ToDo:  
	## für alle verfügbaren $php_errormsg eindeutige Fehlernummern festlegen  
  
	return $error_txt;  
}  
  
#------------------------------------------------------------------------------  
function changer($filename, $number=1)  
{  
    GLOBAL $MYERRORMSG;  
  
    $fp = @fopen($filename, 'rb+');  
	if (!$fp)  
	{  
		$MYERRORMSG = get_error_msg($php_errormsg);  
		return false;  
	}  
	  
	if (!@flock($fp, LOCK_EX))  
	{  
		$MYERRORMSG = get_error_msg($php_errormsg);  
		return false;  
	}  
	  
	$filesize = filesize($filename);  
	$cont = fread($fp, $filesize);  
	  
	$_data = @parse_ini_string($cont, true);  
	if ($_data === false)  
	{  
		$MYERRORMSG = "1000 - Fehler beim Parsen der Datenquelle $filename: $php_errormsg";  
		return false;  
	}  
	  
	  
	if (!isset($_data['active'], $_data['reserve']))  
	{  
		$MYERRORMSG = '1010 - allg. Fehler in der Datenquelle';  
		return false;  
	}  
	  
	if (count($_data['active']) === 0  && count($_data['reserve']) === 0)  
	{  
		$MYERRORMSG = '1011 - Datenquelle ist leer';  
		return false;  
	}  
	  
	if (count($_data['active']) + count($_data['reserve']) < $number)  
	{  
		$MYERRORMSG = '1012 - Datenquelle enthält zuwenig Daten';  
		return false;  
	}  
  
	$_selection = array();  
	$shuffle_flag = false;  
	  
	for ($i = 0; $i < $number; $i++)  
	{  
		if (count($_data['active']) === 0)  
		{  
			$_data['active'] = $_data['reserve'];  
			## reserve-Array wieder leeren  
			$_data['reserve'] = array();  
			$shuffle_flag = true;  
		}  
		$shift = array_shift($_data['active']);  
		$_selection[] = $shift;  
		$_data['reserve'][] = $shift;  
	}  
  
	## erst hier mischen, weil sonst in $_selection Einträge mehrmals auftreten könnten  
	if ($shuffle_flag)  
	{  
		shuffle($_data['active']);	  
		shuffle($_data['reserve']);	  
	}	  
	  
    ftruncate ($fp, 0);	  
	fseek($fp, 0, SEEK_SET);  
	fwrite ($fp, ';### ' . basename($filename) . ' ### ' . date('Y-m-d H:i:s') . ' ### utf-8 ### ÄÖÜäöü' . PHP_EOL);  
  
    fwrite ($fp, '[active]' . PHP_EOL);  
	foreach($_data['active'] as $key => $value)  
	{  
	    fwrite ($fp, "$key = $value" . PHP_EOL);  
	}  
	  
    fwrite ($fp, PHP_EOL . '[reserve]' . PHP_EOL);  
	foreach($_data['reserve'] as $key => $value)  
	{  
	    fwrite ($fp, "$key = $value" . PHP_EOL);  
	}  
  
	fclose($fp);   ## ich vertraue hier auf das OS. PHP ist zu doof dazu  
                       ## dass der Lock beim Schließen aufgehoben wird	  
                       ## und voher die Buffers geschrieben wurden  
    return $_selection;  
}  
  
#==============================================================================  
# php unit test  
#==============================================================================  
  
echo "<pre>\r\n";  
echo htmlspecialchars(print_r(changer($filename,3),1)) . "\r\n";  
echo $MYERRORMSG . "\r\n";  
echo "</pre>\r\n";  
  
?>  

Und zum Testen ein Datenfile, damit Ihr das nicht selber eintippen müsst :-P

  
;### changer.dat ### 2014-05-09 16:21:00 ### utf-8 ### ÄÖÜäöü  
[active]  
0 = 'schwarz'  
1 = 'braun'  
2 = 'rot'  
3 = 'orange'  
4 = 'gelb'  
5 = 'grün'  
6 = 'blau'  
7 = 'violett'  
8 = 'grau'  
9 = 'weiß'  
10 = 'gold'  
11 = 'silber'  
  
[reserve]  
  

Ob man damit nun Werbebanner durchtickert oder Farben oder News-Dateien, ist der Ini-Datei egal. Ich habe extra keine serialized Arrays benutzt, weil man so ganz einfach die Datei mit einem Editor füttern kann.

Wenn wir die letzten Fehler noch gefunden haben, machen wir einen kleinen Artikel fürs Wiki daraus, mit ordentlich viel Kommentaren und Fragen und Antworten versehen bitte.

Wenn Tami noch Lust dazu hat, können wir ja die überarbeitete Klasse daneben stellen. Dann haben alle 'was davon.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bikers-lodge.com
0 59

Array zufällig ausgeben und ausgegeben Werte merken

Sinje
  • php
  1. 0
    Siri
    • programmiertechnik
  2. 0
    Melvin Cowznofski
    1. 0
      Tom
      1. 0
        Tom
      2. 0
        Melvin Cowznofski
        1. 0
          Tom
    2. 0

      Glossar: "auskommentieren"

      Der Martin
      • programmiertechnik
      1. 0
        Matthias Apsel
    3. 0
      Matthias Apsel
      1. 0
        Melvin Cowznofski
  3. 0
    Tom
    1. 0
      Sinje
      1. 0
        Tom
  4. 0

    Ticken PHP-Programmierer anders?

    Siri
    1. 0
      Matthias Apsel
      1. 0
        Siri
        1. 0

          PHP tickt anders - wie eigentlich jede Programmiersprache

          dedlfix
          1. 0
            Siri
            1. 0
              dedlfix
    2. 0
      Tom
      1. 0
        Siri
        1. 0
          tami
          1. 0
            Tom
        2. 0
          Tom
          1. 0
            Sinje
            1. 0
              Tom
  5. 0
    Claudius L.
    1. 0
      tami
      1. 0
        Claudius L.
    2. 0
      Tom
      1. 0
        Tom
      2. 0
        Claudius L.
        1. 0
          Tom
          1. 0
            Claudius L.
            1. 0
              Tom
            2. 0
              tami
              1. 0
                tami
                1. 0

                  Wirksames File-Locking geht anders!

                  Tom
                  1. 0
                    tami
                    1. 0
                      Tom
                      1. 0
                        tami
                        1. 0

                          gehst Du eine Test-Wette mit mir ein?

                          Tom
                          • menschelei
                          1. 0
                            tami
                            1. 0

                              Und wer testet jetzt?

                              Tom
                              1. 0
                                tami
                                1. 0
                                  Tom
                                  1. 0
                                    Matthias Apsel
                                    1. 0

                                      neue Artikel anlegen, Namen finden

                                      Tom
                                      • selfhtml-wiki
                                      1. 0
                                        Matthias Apsel
                                        1. 0
                                          Tom
                                          1. 0
                                            Matthias Apsel
                                            1. 0
                                              tami
                                  2. 0

                                    Und wer testet jetzt? -> mit SQL?

                                    Gaby
                                    • datenbank
                                    1. 0
                                      Tom
              2. 0
                Tom
  6. 0

    Array zufällig ausgeben und ausgegeben Werte merken - so?

    tami
    1. 0
      Tom
  7. 1
    Tom