Arraynamen "array['etc']" deklarieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • onemorenerd
    antwortet
    err und msg sind aber keine Daten.

    Wenn ich es richtig verstanden habe, sind die Daten auch nicht immer gleich strukturiert. Im Beispiel da oben hast du zum Beispiel nur eine row. Was ist, wenn du eine ganze Liste zurückgeben willst? Wird das dann $arr['row'] = $list oder doch $arr['list']? Wie auch immer du darauf antwortest, der Empfänger dieses Arrays muss wissen was er da vor sich hat. Denn die Struktur selbst gibt darüber keine Auskunft.

    Der Empfänger muss nicht nur die Daten analysieren, sondern vorher auch die Metadaten. Irgendeine Logik muss feststellen, ob die Daten überhaupt betrachtet werden sollten oder ob es einen Fehler gab (err/msg).

    Das Wissen über Struktur und Bedeutung der Daten steckt also an mindestens zwei Stellen: In der Funktion und irgendwo außerhalb. Schlechtes Zeichen.

    Im Moment ist das vielleicht kein Problem, alles ist noch recht überschaubar. Aber Code lebt, wächst und verändert sich. Demnächst willst du mehr als nur row zurückgeben oder noch irgendwelche Zustandsinformationen außer err. Was machst du dann? Erweiterst du die Logik, die $arr verarbeitet? Glaubst du, das du da in 5 Jahren noch durchsiehst? Oder ein Fremder?

    Baue ein ordentliches Fehlerhandling ein, statt err und msg.
    Kapsel die Daten und notwendiges Wissen darüber in Objekte.

    Einen Kommentar schreiben:


  • phpMorpheus2
    antwortet
    Zitat von onemorenerd Beitrag anzeigen
    PHP-Code:
    array_push($arr$arr['err']);
    array_push($arr$arr['msg']); 
    Was soll das werden? Vertippt?

    Übrigens keine gute Idee, Funktionen irgendwelche Datenstrukturen zurückgeben zu lassen, die außerhalb interpretiert werden müssen.
    Bei der Suche nach "Eleganz im Detail" leider den Blick fürs Wesentliche verloren ...
    Warum keine gute Idee?
    Eine Funktion wird angesprochen, brechnet die Daten und gibt Sie zurück.
    Was soll die Funktion denn sonst machen?
    Direkte Ausgabe?

    PS: Ja, vertippt :-P

    Einen Kommentar schreiben:


  • onemorenerd
    antwortet
    PHP-Code:
    array_push($arr$arr['err']);
    array_push($arr$arr['msg']); 
    Was soll das werden? Vertippt?

    Übrigens keine gute Idee, Funktionen irgendwelche Datenstrukturen zurückgeben zu lassen, die außerhalb interpretiert werden müssen.
    Bei der Suche nach "Eleganz im Detail" leider den Blick fürs Wesentliche verloren ...

    Einen Kommentar schreiben:


  • h3ll
    antwortet
    Zitat von phpMorpheus2 Beitrag anzeigen
    Ja, das wollte ich wissen.
    Perfekt. Somit wieder ein haufen unnütze Arbeit unf Performance erspart!

    Danke jungs. Ihr seit die besten
    Man hätte sich auch einfach mal die Grundlagen über Arrays anschauen können. Denn nichts anderes ist das.

    Einen Kommentar schreiben:


  • phpMorpheus2
    antwortet
    Ja, das wollte ich wissen.
    Perfekt. Somit wieder ein haufen unnütze Arbeit unf Performance erspart!

    Danke jungs. Ihr seit die besten

    Einen Kommentar schreiben:


  • wahsaga
    antwortet
    Wie schon gesagt wurde, wenn $x als array() definiert ist - dann kannst du
    PHP-Code:
    $x['blah'][47]['blubb'][] = $wert
    schreiben, ohne auch nur eine einzige dieser "Ebenen" explizit deklariert zu haben - das macht PHP bei deren erster Verwendung automatisch.

    Und das letzte [] ist der "Ersatz" für array_push - es legt dort ein neues Array-Element an, und zählt dabei den nummerischen Index hoch.

    Einen Kommentar schreiben:


  • combie
    antwortet
    Vergiss doch endlich bitte das array_push !!!!!

    PHP-Code:
    $arr = array(); 
    // $arr['err'] = array();  Unsinn!
    // $arr['msg'] = array();  Unsinn!
    $arr['row'] = array(); 

    $arr['err'] = false
    $arr['msg'] = "Kein Fehler"

    // array_push($arr, $arr['err']); Unsinn
    // array_push($arr, $arr['msg']); Unsinn

    while... 

    //   array_push($arr['row'], $row); 
       
    $arr['row'][] = $row// reicht dir doch zu 100%, oder?


    // usw. 
    Zuletzt geändert von combie; 27.05.2009, 17:13.

    Einen Kommentar schreiben:


  • phpMorpheus2
    antwortet
    Ok Kropff.

    Also es ist so, dass ich eine Array als Return Wert zurück gebe mit den berechneten Daten.
    So kann die Useroberfläche mit dem Design besser angepasst werden, wenn nur eine Array mit allen Informationen vorhanden ist und nicht alle Berechnungen etc. (Verständlich oder)

    Nun wird in einer Funktion eine Array mit mehreren Werten gefüllt.
    z.B. ob es einen Fehler gab.
    Wenn ja, die Fehlernachricht.
    Wenn es keinen Fehler gab, dann err=false und in die selbe Array werden dann die Daten gepackt.

    eine fertige Array die als Return Wert zurückgegeben wird sieht z.B. so aus:
    PHP-Code:
    Array
    (
        [
    row] => Array
            (
                [
    0] => Array
                    (
                        [
    col] => 1
                        
    [status] => 4
                        
    [id] => 16
                        
    [timestamp] => 1239635577
                        
    [subject] => Test 1
                    
    )

                [
    1] => Array
                    (
                        [
    col] => 1
                        
    [status] => 4
                        
    [id] => 17
                        
    [timestamp] => 1232368569
                        
    [subject] => Test 2
                    
    )

                [
    2] => Array
                    (
                        [
    col] => 2
                        
    [status] => 0
                        
    [id] => 20
                        
    [timestamp] => 1239635455
                        
    [subject] => Test 4
                    
    )

            )

        [
    err] => false
        
    [msg] => Kein Fehler

    In dieser Array sind nun alle Daten die ich zur Anzeige brauche und schöpfe Sie auch daraus.

    Ist kein Fehler vorhanden, so wird [row] durchgegangen und alle Einträge werden als Liste aufgelistet usw.

    Wenn ich in meinem Code nun MEHR als nur [err] und [msg] definiere,
    weil ich z.B. mehrere Informationen brauche,
    so möchte ich nicht immer alle $arr['err'] $arr['msg'] usw. extra definieren müssten!

    Code (vereinfacht, freihand):
    PHP-Code:
    $arr = array();
    $arr['err'] = array();
    $arr['msg'] = array();
    $arr['row'] = array();

    $arr['err'] = false;
    $arr['msg'] = "Kein Fehler";

    array_push($arr$arr['err']);
    array_push($arr$arr['msg']);

    while...
    {
    array_push($arr['row'], $row);
    }

    // usw. 
    Ich muss für jede Unterebene der Variable deklarieren, damit
    array_push als Argument eine Array vorliegen hat.
    Das die Funktion als Argument eine Array braucht ist ja nicht das Problem.
    Es geht mir nur darum, alles zu deklarieren, anstatt einfach NUR $arr als Array
    zu deklarieren und somit auch alle etweigen unterbenen die erstellt werden.

    Natürlich ist es logisch, dass es nicht so ist!
    Ich suche aber eine Möglichkeit, dies zu bewerkstelligen.

    Hoffe, es hilft

    Einen Kommentar schreiben:


  • combie
    antwortet
    Wenn ich "$var = 'hello'" schreibe und irgendein Honk schreibt weiter unten im Code (aus Versehen?) "$var = array('hello', 'world')" – kann ich doch nichts gegen machen?
    Korrekt!
    Und genau darum sollte man grundsätzlich auf globale Variablen verzichten.
    Das ist eine einfache Möglichkeit, um unerwünschte Seitenefekte zu vermeiden.

    Einen Kommentar schreiben:


  • ApoY2k
    antwortet
    Ich misch mich einfach mal kackendreist ein…

    Aber ist es nicht so (mein Kentnissstand ist nicht besoders hoch, man verzeihe mir Missverständnisse), dass man in PHP Variablen garnicht "fest" deklarieren kann?

    Wenn ich "$var = 'hello'" schreibe und irgendein Honk schreibt weiter unten im Code (aus Versehen?) "$var = array('hello', 'world')" – kann ich doch nichts gegen machen?

    Einen Kommentar schreiben:


  • Kropff
    antwortet
    sind denn die unterebenen bekannt? und auch deren struktur? sag mal, was du konkret vorhast. vielleicht hilft das meinem verständnis auf die sprünge.

    peter

    Einen Kommentar schreiben:


  • phpMorpheus2
    antwortet
    Zitat von onemorenerd Beitrag anzeigen
    Weil $arr['etc'] kein Array ist und die Funktion array_push() eben so implementiert ist, dass es dann eine Notice gibt. Steht doch im Manual.
    Natürlich steht das im Manual.
    Das war auch nicht die Frage, wie array_push() funktioniert,
    sondern ob es eine Möglichkeit gibt, eine definierte Array "samt aller Unterebenen" als array zu deklarieren!

    Einen Kommentar schreiben:


  • viego
    antwortet
    Zitat von phpMorpheus2 Beitrag anzeigen
    ...
    Ich suche nur sehr oft nach verbesserungsmöglichkeiten um alles komfortabler
    und sauberer programmieren zu können.
    Ich kann ein sehr schönen Algo haben, dennoch versuche ich immer wieder
    etwas zu verbessern.

    ...
    Na weil er doch auch andere Wege sucht. Und sich weiter entwickeln will. Der OOP-Ansatz war ja nur ein Beispiel. Von mir aus kann er seine Daten nur in a und b codiert ablegen. Hauptsache es macht ihm Spaß.

    Einen Kommentar schreiben:


  • Kropff
    antwortet
    @phpMorpheus2
    fixier dich nicht auf array_push. das brauchst du in javascript ständig, aber nicht in php. da kannst du viel einfacher vorgehen.
    Vielleicht fällt dir ja eine schöne Klassen-Konstruktion ein.
    es muss doch nicht alles in oop gemacht werden. arrays sind wunderbar geeignet, um datenstrukturen abzubilden. also warum nicht damit arbeiten?

    peter

    Einen Kommentar schreiben:


  • viego
    antwortet
    Wenn man error_reporting auf E_ALL hat :P

    @phpMorpheus2: Unsere Aussagen decken sich ja dann doch. Ich wollte dich nur mal anstubsen, dass du vielleicht außerhalb der Array-Welt schaust, ob es da eine bessere Lösung für dein Problem gibt. Wobei "besser" hier wohl als "schöner" zu interpretieren ist. Vielleicht fällt dir ja eine schöne Klassen-Konstruktion ein...

    Einen Kommentar schreiben:

Lädt...
X