enrico: PHP-Array in JS-Array umwandeln

Guten Abend,

bei meinem Projekt "DVD-Verwaltung" klappen die geabsichtigten Funktionalitäten (Einlesen aus
Datei, Übergabe an ein PHP-Array, auf- und absteigende Sortierungen) endlich einwandfrei.

Mein nächster Step ist nun der Aufbau einer ausgefeilten Filterfunktion über drei von einander
abhängiger Selectlisten mittels Javascript.

Damit ich mich an die Umsetzung dieses Vorhabens machen kann, ist es aber zunächst notwendig,
dass ich das eingelesene PHP-Array in ein Javascript-Array umwandle.

Dies klappt mit nachfolgendem Code fast perfekt:

function PHP_Array_umwandeln ($Umzuwandelndes_PHP_Array, $Name_des_JS_Arrays, $Rekursion = false)
      {
         $JS_Array = $Rekursion ? $Name_des_JS_Arrays . "{" : $Name_des_JS_Arrays . " = {\n";
         $Name_des_JS_Arrays = "\t$Name_des_JS_Arrays";
         reset ($Umzuwandelndes_PHP_Array);

while (list ($Schluessel, $Wert) = each ($Umzuwandelndes_PHP_Array))
         {
            if (($Schluessel == "Nr") || ($Schluessel == "Inhalt"))
            {
               next;
            }
            else
            {
               $JS_Schluessel = "'" . $Schluessel . "':";

if (is_array ($Wert))
               {
                  $Zwischenspeicher [] = PHP_Array_umwandeln ($Wert, $JS_Schluessel, true);
               }
               else
               {
                  if (is_numeric ($Wert))
                  {
                     $JS_Schluessel .= "$Wert";
                  }
                  else
                  {
                     static $Muster = array ("\", "'", "\r", "\n");
                     static $Ersetzungen = array ('\', '\'', '\r', '\n');
                     $JS_Schluessel .= "'" . str_replace ($Muster, $Ersetzungen, $Wert) . "'";
                  }

$Zwischenspeicher [] = $JS_Schluessel;
               }
            }
         }

$JS_Array .= implode (', ', $Zwischenspeicher);

$JS_Array .= "}\n";

return $JS_Array;
      }

$Inhalt = unserialize (file_get_contents ("../SAMMLUNG/Sammlung.txt"));

echo PHP_Array_umwandeln ($Inhalt, 'Inhalt');

Prinzipiell läuft meine Funktion wie geplant, ich kann auf die übergebenen Werte aus Javascript heraus zugreifen,
bis auf folgende Ungereimtheiten:

Die Ausgabe beginnt erst bei 1 und nicht bei 0, so dass die erste Zeile der einzulesenden Datei weggelassen wird,
und zweitens habe ich bei allen FSK-Angaben, ausgenommen die letzte Listung, die Zusätze "\r\n".

Hier die Bildschirmausgabe (zusammengefasst):

Inhalt = {
           '1':{'Nr':2, 'Titel':'ORIGINAL SIN', 'Genre':'Drama/Thriller', 'FSK':'16\r\n'}
         , '2':{'Nr':3, 'Titel':'OPEN WATER 2', 'Genre':'Thriller', 'FSK':'12\r\n'}
         , '3':{'Nr':4, 'Titel':'LEFT IN DARKNESS - DÄMONEN DER DUNKELHEIT', 'Genre':'Horror/Fantasy', 'FSK':'18\r\n'}

...usw...

, '28':{'Nr':29, 'Titel':'STIRB LANGSAM 4.0', 'Genre':'Action', 'FSK':16}
      }

Wenn ich die Abfrage nach der "Nr" oder dem "Inhalt" mit vorzeitigem Abbruch der while-Schleife weglasse, dann beginnt
die Umwandlung zwar bei 0, aber ich benötige nur die Spalten "Titel", "Genre" und "FSK".

Die Ausgabe im Quelltext sieht hier wie folgt aus:

Inhalt = {
           '0':{'Nr':1, 'Titel':'LIGHTHOUSE - INSEL DES GRAUENS', 'Inhalt':'Mitten auf dem ..', 'Genre':'Horror/Thriller', 'FSK':'16\r\n'}
         , '1':{'Nr':2, 'Titel':'ORIGINAL SIN', 'Inhalt':'Im Kuba des ausgehenden 19....', 'Genre':'Drama/Thriller', 'FSK':'16\r\n'}

...usw...

, '28':{'Nr':29, 'Titel':'STIRB LANGSAM 4.0', 'Inhalt':'Eine neue Art...', 'Genre':'Action', 'FSK':16}
      }

Was muß ich bei meinem Code umstellen/korrigieren, damit ich, vom "Datensatz" 0 beginnend nur die Spalten "Titel", "Genre" und "FSK"
erhalte ?

Was muß ich ändern, damit ich die Zusätze "\r\n" bei den FSK-Angaben wegbekomme ?

Vielen Dank für Eure Anregungen/Tips/Hilfestellungen.

Gruß
Enrico

  1. Hallo,

    Damit ich mich an die Umsetzung dieses Vorhabens machen kann, ist es aber zunächst notwendig, dass ich das eingelesene PHP-Array in ein Javascript-Array umwandle.

    Ich würde bei so etwas spontan immer JSON nehmen, das auf JS-Notation basierende Format für Datenstrukturen. Mit PHP 5.2 gibt's auch schon ein eingebautes json_encode(). Damit erspart man sich vermutlich viel Ärger, wenn man die Datenstruktur einfach in PHP zurechtstutzt und dann in JSON umwandelt.

    Hier die Bildschirmausgabe (zusammengefasst):
          Inhalt = {
               '1': ...

    Das ist übrigens kein JS-Array, sondern ein Javascript-Objekt,das einige grundsätzliche Eigenheiten mit der Datenstruktur namens Map / Hash / Dictionary / Table / Assoziatives Array teilt. Javascriptige Arrays sind kontinuierlich mit Integern indizierte Listen. PHP gehört zu den Sprachen, die numerisch indizierte und mit whatever indizierte Tabellen zu einer einheitlichen Struktur vereinheitlicht haben, die verwirrenderweise auch Array heisst. Zum Zwecke des Zugriffs macht das in JS zwar keinen Unterschied; eine vernünftige JSON-Funktions würde aber ein »richtiges« Array ("[1, 2, 3]") ausspucken.

    Wobei: Es macht doch einen ziemlich heftigen Unterschied: In der JS-Umgebung ist Dein JS-Objekt mit Strings indiziert, d.h. Du musst mit Inhalt["1"] statt Inhalt[1] darauf zugreifen; einfache Iteration ist also nur umständlich möglich.

    Was muß ich ändern, damit ich die Zusätze "\r\n" bei den FSK-Angaben wegbekomme ?

    Ich hab ja nicht wirklich Ahnung von PHP, aber wenn ich in die Funktionsreferenz von is_numeric() gucke, dann spuckt das auch Wahr für »numerische Strings« aus, d.h. Strings, die wie Zahlen aussehen. Kann es vielleicht sein, dass Deine FSK-Zahlen in der Eingabe-Datenstruktur nicht als Zahlen, sondern als Strings vorliegen, aber trotzdem in den is_numeric-Zweig landen und dort eben nicht mit Deiner String-Bereinigungs-Routine behandelt werden. Weswegen ich darauf komme? In Deiner Ausgabe sind die Zahlen Strings statt Zahlen im Sinne der JS-Notation.

    (is_numeric ist ja wirklich schlimm. Jesses!)

    Tim

    1. echo $begrüßung;

      Ich hab ja nicht wirklich Ahnung von PHP, aber wenn ich in die Funktionsreferenz von is_numeric() gucke, dann spuckt das auch Wahr für »numerische Strings« aus, d.h. Strings, die wie Zahlen aussehen.
      (is_numeric ist ja wirklich schlimm. Jesses!)

      Genau das ist die Aufgabe von is_numeric(). Es arbeitet damit gut mit den Eingabewerten aus HTTP-Requests zusammen. Diese Werte liegen ja generell als String vor. Oftmals (meist?) passiert die Weiterverarbeitung auch als String. Beispielsweise beim Ausgeben in eine Datenbank oder ins HTML. Ein Parsen zwecks Testen mit anschließendem Wiederzurückwandeln in String ist da überflüssig. Wenn man wirklich einen Zahlen-Typ benötigt und die automatische Typumwandlung nicht anwendbar ist, gibt es Funktionen wie intval() und floatval().

      echo "$verabschiedung $name";

    2. Hallo

      Wobei: Es macht doch einen ziemlich heftigen Unterschied: In der JS-Umgebung ist Dein JS-Objekt mit Strings indiziert, d.h. Du musst mit Inhalt["1"] statt Inhalt[1] darauf zugreifen; einfache Iteration ist also nur umständlich möglich.

      hier irrst du (zum Glück ;)

        
      Inhalt={};  
      Inhalt["1"]="x";  
      alert(Inhalt[1]);  
      
      

      JS realisiert alle Objekte auch Arrays intern als Hash, d.h. jeder Nummerischer Index wird intern in einen Stringkey verwandelt.

      Bye
       Kurt