Georg: Arrays sortieren

Hallo,

ich habe folgende Fragestellung nur noch keine Idee wie ich es am besten umsetzen kann:

Zunächst habe ich schon einmal ein Array erzeugt.

  
Array (  
  Array[0] (  
     [0]=>Kriterium 1  
     [1]=>unwichtig  
     [2]=>Name D  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
  Array[1] (  
     [0]=>Kriterium 2  
     [1]=>unwichtig  
     [2]=>Name A  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
  Array[2] (  
     [0]=>Kriterium 2  
     [1]=>unwichtig  
     [2]=>Name B  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
  Array[3] (  
     [0]=>Kriterium 1  
     [1]=>unwichtig  
     [2]=>Name C  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
.  
.  
.  
)  

Ich möchte jedoch das Array mit einer anderen Reihenfolge haben. Nun will ich aber erst die Werte mit Kriterium 1 in alphabetischer reihenfolge mit dem Namen haben.

  
Array (  
  Array[0] (  
     [0]=>Kriterium 1  
     [1]=>unwichtig  
     [2]=>Name C  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
  Array[1] (  
     [0]=>Kriterium 1  
     [1]=>unwichtig  
     [2]=>Name D  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
  Array[2] (  
     [0]=>Kriterium 2  
     [1]=>unwichtig  
     [2]=>Name A  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
  Array[3] (  
     [0]=>Kriterium 1  
     [1]=>unwichtig  
     [2]=>Name B  
     [3]=>unwichtig  
     [4]=>unwichtig  
     [5]=>unwichtig  
  )  
.  
.  
.  
)  

Sprich eine Art ORDER BY Kriterium, Name ASC

Habe einige Sortierungsmöglichkeiten wie sort() und Co. versucht, doch bislang ohne Erfolg.

Hab ihr einen Tipp?

danke im vorraus

  1. )
      Array[2] (
         [0]=>Kriterium 2
         [1]=>unwichtig
         [2]=>Name A
         [3]=>unwichtig
         [4]=>unwichtig
         [5]=>unwichtig
      )
      Array[3] (
         [0]=>Kriterium 1 /MeinFehler soll natürlich 2 sein
         [1]=>unwichtig
         [2]=>Name B
         [3]=>unwichtig
         [4]=>unwichtig
         [5]=>unwichtig
      )
    .
    .
    .
    )

    
    
  2. Hi!

    Sprich eine Art ORDER BY Kriterium, Name ASC
    Habe einige Sortierungsmöglichkeiten wie sort() und Co. versucht, doch bislang ohne Erfolg.

    Die u*sort-Funktionen solltest du dir ansehen. Um array_multi_sort() allerdings solltest du einen Bogen machen, denn das passt nicht zu deiner Struktur, es sei denn, du willst von der zeilenorientierten Organisation zu einer spaltenorientierten wechseln.

    Lo!

    1. Hi dedlfix.

      [...] es sei denn, du willst von der zeilenorientierten Organisation zu einer spaltenorientierten wechseln.

      Ich hab da mal ne kurze Frage:

      Die Begriffe 'zeilenorientiert' und 'spaltenorientiert' fuer Arrays gibt es zunaechst mal eher im Zusammenhang mit Speicherverwaltung bzw. Linearisierung von Arrays.

      In diesem Zusammenhang hier - also, Layout von Arrays - sind die Begriffe da gaengig, oder ist das eher eine "proprietaere" Ausdrucksweise hier im Forum/von Dir? Denn irgendwie treffen sie nicht so wirklich den Punkt, oder? Sie vergleichen das Array mit irgendeinem a priori nicht vorhandenen Datenmuster. Ein Array von Arrays ist in PHP irgendwie, naja, immer gleich orientiert...

      Wie wurderst Du in einem Satz die Begriffe erklaeren?

      Viele Gruesse,
      der Bademeister

      1. Hello,

        Wie wurderst Du in einem Satz die Begriffe erklaeren?

        http://www.phpbar.de/w/Multidimensionales_Array_sortieren

        Wenn Du darüber diskutieren möchtest, welchen Einfluss die passende Datenorganisation auf die Bequemlichkeit und Übersichtlichkeit bei der Verarbeitung hat, dann bist Du herzlich eingeladen :-)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          Wie wurderst Du in einem Satz die Begriffe erklaeren?

          http://www.phpbar.de/w/Multidimensionales_Array_sortieren

          Wenn Du darüber diskutieren möchtest, welchen Einfluss die passende Datenorganisation auf die Bequemlichkeit und Übersichtlichkeit bei der Verarbeitung hat, dann bist Du herzlich eingeladen :-)

          PS: Warum willst Du Dedlfix eigentlich Vorschriften machen, mit wievielen Sätzen er die Begriffe erklären soll? Solche Vorschriften sind immer ein Indiz für eine Art "Faschismus" (entsprechendes Denken). Wahre Wissenschaftler und Demokraten lassen auch Erklärungen in mehreren Sätzem zu und helfen sogar noch bei der Formulierung, auch wenn diese nicht ihre eigene Meinung widerspiegelt.

          ;-P

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi Tom.

            Wie wurderst Du in einem Satz die Begriffe erklaeren?

            http://www.phpbar.de/w/Multidimensionales_Array_sortieren

            Daraus:

            Beim Zeilen-basierten Array enthält jedes Element der 1. Dimension des Arrays alle Werte einer Zeile - beim Spalten-basierten alle Werte einer Spalte.

            Die Definition ist leider reichlich rekursiv, und damit leer. Man hat a priori keinerlei Zeilen bzw. Spalten (ausser ggf. die, die durch das PHP-Design des Arrays vorgegeben sind).

            und noch ein Link.
            Hat mir keine Probleme gemacht, dan per Google zu finden:

            http://books.google.de/books?id=pTKAwL64NkoC&pg=PA463&lpg=PA463&dq=Spaltenorientiertes+Array&source=bl&ots=kuTcydN67M&sig=IVLFaILO-PNz33zsfskeWs30H-4&hl=de&ei=nelSTfKsJs7Nswby6PncBg&sa=X&oi=book_result&ct=result&resnum=2&ved=0CB8Q6AEwAQ#v=onepage&q&f=false

            Da gehts um ein anderes Thema: Linearisierung von Arrays. Habe ich ja oben bereits angesprochen.

            PS: Warum willst Du Dedlfix eigentlich Vorschriften machen, mit wievielen Sätzen er die Begriffe erklären soll? Solche Vorschriften sind immer ein Indiz für eine Art "Faschismus" (entsprechendes Denken). Wahre Wissenschaftler und Demokraten lassen auch Erklärungen in mehreren Sätzem zu und helfen sogar noch bei der Formulierung, auch wenn diese nicht ihre eigene Meinung widerspiegelt.

            Zugegeben. Der Teil "in einem Satz" sollte nicht das bedeuten, was er bedeutet. Und eigentlich sollte er auch nichts anderes bedeuten. Also bitte streichen :-)

            Viele Gruesse
            der Bademeister

            1. Hello,

              Zugegeben. Der Teil "in einem Satz" sollte nicht das bedeuten, was er bedeutet. Und eigentlich sollte er auch nichts anderes bedeuten. Also bitte streichen :-)

              Die Begriffe

              • Datensatz
              • Feld
              • Zeile
              • Spalte

              sind doch sowieso nur allgemeiner Natur. Sie beschreiben nur eine Modellvorstellung der Datenorgansation.

              PHP hat streng genommen auch nur einen Array-Typ, das ist der String. Das, was in PHP "Array" genannt wird, ist ja gar kein "Speicherfeld" == "Array".

              PHP organsisiert die Daten als Listen, die man sich auch als verkettete Listen vorstellen darf. Miteinander verknüpfte (verkettete) Listen ergeben dann aber defininitionsgemäß eine Baumstruktur. Mit dieser Vorstellung kommt man auch am weitesten.

              Eine Baumstruktur (in PHP) muss aber in keiner Weise regelmäßig aufgebaut sein, was wiederum für eine tabellarische Darstellung die Voraussetzung wäre. Die tabellerische Darstellung als "Satz-" oder "Spaltenarray" ist demnach sowieso nur ein Sonderfall der in PHP möglichen Baumstrukturen, wenn auch der häufigste.

              Im übrigen organisieren die meisten Datenbanken heute ihre Daten auch in Spalten oder Spaltenbäumen, und nicht mehr in geschlossenen Datensätzen, so wie dBase dies noch getan hat. Wie sie die Daten dann aber nach außen repräsentieren, steht auf einem ganz anderen Blatt.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Tach.

                PHP organsisiert die Daten als Listen, die man sich auch als verkettete Listen vorstellen darf. Miteinander verknüpfte (verkettete) Listen ergeben dann aber defininitionsgemäß eine Baumstruktur. Mit dieser Vorstellung kommt man auch am weitesten.

                Wieso willst Du den Leuten eigentlich immer und immer wieder das Bild von verketteten Listen in den Kopf hämmern, wenn es um Arrays in PHP geht? Am anschaulichsten ist doch wirklich die Definition, daß ein Array-Element in PHP *alles* sein kann, z. B. auch ein anderes Array. Worin genau besteht der Verständnisgewinn Deiner Erklärung?

                Es stimmt ja, daß bei den Arrays intern verkettete Listen zum Einsatz kommen (sogar mehr als Du vermutlich glaubst). Das ist aber ganz sicher nicht der entscheidende Aspekt der PHP-Arrays. Dieser besteht nämlich darin, daß die Arrays als Hash Maps implementiert sind, was eben dazu führt, daß z. B. *nicht* die ersten zwanzig Elemente einer Liste durchlaufen werden müssen, um auf das einundzwanzigste zuzugreifen.

                --
                Always remember that you are unique. Just like everybody else.
                1. Hello,

                  PHP organsisiert die Daten als Listen, die man sich auch als verkettete Listen vorstellen darf. Miteinander verknüpfte (verkettete) Listen ergeben dann aber defininitionsgemäß eine Baumstruktur. Mit dieser Vorstellung kommt man auch am weitesten.

                  Wieso willst Du den Leuten eigentlich immer und immer wieder das Bild von verketteten Listen in den Kopf hämmern, wenn es um Arrays in PHP geht? Am anschaulichsten ist doch wirklich die Definition, daß ein Array-Element in PHP *alles* sein kann, z. B. auch ein anderes Array. Worin genau besteht der Verständnisgewinn Deiner Erklärung?

                  Es stimmt ja, daß bei den Arrays intern verkettete Listen zum Einsatz kommen (sogar mehr als Du vermutlich glaubst). Das ist aber ganz sicher nicht der entscheidende Aspekt der PHP-Arrays. Dieser besteht nämlich darin, daß die Arrays als Hash Maps implementiert sind, was eben dazu führt, daß z. B. *nicht* die ersten zwanzig Elemente einer Liste durchlaufen werden müssen, um auf das einundzwanzigste zuzugreifen.

                  Es geht um ein möglichst treffendes Vorstellungsmodell.
                  Eine beidseitig verkettete Liste mit isolierten Listpointern trifft dies am besten.

                  • Man kann Elemente in die Liste einhängen. Standard ist das Ende,
                      man kann aber an jeder Stelle Elemente einhängen.

                  • Die Elemente stehen einzeln. Das heißt, ihre Position im Speicher hat nichts
                      mit ihrem Index zu tun. Ihre Position in der Liste ist nicht von der Liste
                      abhängig (wo gerade ein freier Platz ist), sondern nur über ihre Vorgänger- und
                      Nachfolgerelemente bestimmbar. Man muss die Kette ablaufen.

                  • Der "Index" gehört zum Element und nicht zur Liste, auch wenn sichergestellt wird,
                      dass es ihn in der Kette nicht doppelt geben kann.

                  • Über den Index alleine lässt sich die Position in der Kette (Liste) nicht bestimmen.
                      Die Position in der Liste kann unabhängig vom Index gewählt werden.

                  • Man kann in einer Liste vorwärts und rückwärts navigiern, nicht jedoch springen

                  • Listen können weitere Listen enthalten. Dies ist eine der Definitionen für eine Baumstruktur

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Hi!

                    PHP organsisiert die Daten als Listen, die man sich auch als verkettete Listen vorstellen darf. Miteinander verknüpfte (verkettete) Listen ergeben dann aber defininitionsgemäß eine Baumstruktur. Mit dieser Vorstellung kommt man auch am weitesten.
                    Wieso willst Du den Leuten eigentlich immer und immer wieder das Bild von verketteten Listen in den Kopf hämmern, wenn es um Arrays in PHP geht? Am anschaulichsten ist doch wirklich die Definition, daß ein Array-Element in PHP *alles* sein kann, z. B. auch ein anderes Array. Worin genau besteht der Verständnisgewinn Deiner Erklärung?
                    Es stimmt ja, daß bei den Arrays intern verkettete Listen zum Einsatz kommen (sogar mehr als Du vermutlich glaubst). Das ist aber ganz sicher nicht der entscheidende Aspekt der PHP-Arrays. Dieser besteht nämlich darin, daß die Arrays als Hash Maps implementiert sind, was eben dazu führt, daß z. B. *nicht* die ersten zwanzig Elemente einer Liste durchlaufen werden müssen, um auf das einundzwanzigste zuzugreifen.

                    Es geht um ein möglichst treffendes Vorstellungsmodell.
                    Eine beidseitig verkettete Liste mit isolierten Listpointern trifft dies am besten.

                    Warum benötigst du diese Verkettung zur Erklärung?

                    • Man kann Elemente in die Liste einhängen. Standard ist das Ende,
                        man kann aber an jeder Stelle Elemente einhängen.

                    PHP kennt aber kein Einfügen an beliebigen Stellen, lediglich für vorn und hinten gibt es explizite Funktionen. Insofern ist das Verkettungsmerkmal nicht interessant und es reicht, sich einen Stapel (wie bei Papier) vorzustellen. Man kann oben und unten was anfügen und an beliebigen Stellen ein Blatt entnehmen (unset). Ansonsten ist es mir egal, ob der Stapel abgeheftet ist, wie eine Girlande zusammenhängt oder sonstwie zusmmengehalten wird.

                    • Die Elemente stehen einzeln. Das heißt, ihre Position im Speicher hat nichts
                        mit ihrem Index zu tun. Ihre Position in der Liste ist nicht von der Liste
                        abhängig (wo gerade ein freier Platz ist), sondern nur über ihre Vorgänger- und
                        Nachfolgerelemente bestimmbar. Man muss die Kette ablaufen.

                    Inwiefern soll das einen PHP-Programmierer interessieren? Egal wie das abgelegt ist, er hat darauf keinen Einfluss.

                    • Der "Index" gehört zum Element und nicht zur Liste, auch wenn sichergestellt wird,
                        dass es ihn in der Kette nicht doppelt geben kann.

                    Ebenfalls nicht beeinflussbar, deswegen sehe ich das als irrelevant an.

                    • Über den Index alleine lässt sich die Position in der Kette (Liste) nicht bestimmen.
                        Die Position in der Liste kann unabhängig vom Index gewählt werden.

                    Die Position ist aus PHP heraus weder feststellbar, wenn man nicht gerade (mit foreach) iteriert und mitzählt, noch kann sie direkt beeinflusst werden. (Indirekt nur durch Sortieren.)

                    • Man kann in einer Liste vorwärts und rückwärts navigiern, nicht jedoch springen

                    Auch nicht interessant. Man hat die Keys, um damit auf beliebige Elemente zuzugreifen. Wie das intern gelöst ist, ist nicht relevant, man hat darauf keinen Einfluss.

                    • Listen können weitere Listen enthalten. Dies ist eine der Definitionen für eine Baumstruktur

                    Die Verschachtlungsmöglichkeiten benötigen ebensowenig verkettete Listen zur Erklärung wie Arrays mit nur skalaren Elementen. Wenn man den Papierstapel als Model heranziehen will, wäre eine Verschachtlung ein Verweis auf einen anderen Stapel. Wo sich dieser andere Stapel befindet, ist nebensächlich, der Verweis reicht zum Finden.

                    Lo!

                    1. Hello,

                      PHP kennt aber kein Einfügen an beliebigen Stellen,

                      http://de2.php.net/manual/de/function.array-splice.php

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Hi!

                        PHP kennt aber kein Einfügen an beliebigen Stellen,
                        http://de2.php.net/manual/de/function.array-splice.php

                        Ok, dann stimmte das nicht, hatte ich bisher noch nicht benötigt. Das erklärt aber immer noch nicht, warum du verkettete Listen zur Erklärung nimmst. Ein wichtiges Merkmal verketteter Listen sind die Verweise auf Vorgänger und Nachfolger. Die sieht man als PHP-Programmierer nicht. Man sieht nur ein Gebilde, das aneinandergereiht ein paar Elemente enthält. Ob sie verkettet sind oder nicht spielt keine Rolle.

                        Lo!

                        1. Hello,

                          PHP kennt aber kein Einfügen an beliebigen Stellen,
                          http://de2.php.net/manual/de/function.array-splice.php

                          Ok, dann stimmte das nicht, hatte ich bisher noch nicht benötigt. Das erklärt aber immer noch nicht, warum du verkettete Listen zur Erklärung nimmst. Ein wichtiges Merkmal verketteter Listen sind die Verweise auf Vorgänger und Nachfolger. Die sieht man als PHP-Programmierer nicht. Man sieht nur ein Gebilde, das aneinandergereiht ein paar Elemente enthält. Ob sie verkettet sind oder nicht spielt keine Rolle.

                          Es ist ein Vorstellungsmodell.
                          Das Vorstellungsmodell als verkette Liste kommt der tatsächlichen Funktionalität und Bedienbarkeit am nächsten.

                          Dass man in einer verketteten Liste direkten Zugriff auf die tatsächlichen Objekte haben muss, ist nirgends vorgeschrieben. Es ist sogar normal in höheren (Interpreter-)Programmiersprachen, dass man bei derartigen Baukastenlösungen nur über spezielle Funktionen zugreifen kann. Das kann man bei PHP. Man kann zu einem aktuellen Element der aktiven Liste den Vorgänger und den Nachfolger ermitteln. Die Zeiger darauf gehen den User gar nichts an.

                          Das ist dann, auch geschichtlich nachvollziehbar für andere Interpreter-Programmiersprachen, eine Alternative zur objektorientierten Programmierung.

                          Das "Feeling" ist schon sehr objektorierentiert, weswegen ich ja immer sage, dass entweder Interpreter mit gekapselten Baukästen und Runtimesystem, oder OOP mit Objekten (schlussendlich bis auf Prozessorebene durchkompilierbar), aber nicht beides mischen...

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                          1. Hi!

                            Es ist ein Vorstellungsmodell.
                            Das Vorstellungsmodell als verkette Liste kommt der tatsächlichen Funktionalität und Bedienbarkeit am nächsten.

                            Für mich fühlt es sich eher wie ein Array an, so als ob die Elemente direkt hintereinander liegen. Dass sie in ungeordneter Reihenfolge im Speicher lägen und nur über einen wie auch immer gearteten Mechanismus verbunden wären, kann ich weder von außen sehen, noch kann ich ihn in irgendeiner Form nutzen.

                            Man kann zu einem aktuellen Element der aktiven Liste den Vorgänger und den Nachfolger ermitteln.

                            Ja, wenn man einen Zeiger oder eine Referenz auf das Element hat, kann man das bei einer verketteten Liste. Das ist das entscheidende Merkmal einer solchen. Bei PHP geht das nicht. Man kann Referenzen auf beliebige Elemente legen, aber den Vorgänger oder Nachfolger kann man davon ausgehend nicht ermitteln. Ergo bringt die Vorstellung einer Verkettung keine Punkte. Es gibt lediglich einen Arrayzeiger, den man vom Anfang oder Ende her vorwärts oder rückwärts bewegen kann. Es ist nicht möglich, in der Mitte einzusteigen, was bei einer verketteten Liste ginge, wenn man einen Verweis auf ein Element hat.

                            Die Besonderheit bei PHPs Arrays ist, dass die Elemente beliebigen Typs sein können, damit auch ihre Größe beliebig sein kann und man ihre Position nicht selbst berechnen kann. Somit ergibt sich dann das Bild einer Hashtabelle: Über Keys kann man auf die Elemente zugreifen. Wie das intern gelöst ist, spielt für das Verständnis keine Rolle.

                            Das ist dann, auch geschichtlich nachvollziehbar für andere Interpreter-Programmiersprachen, eine Alternative zur objektorientierten Programmierung.

                            Was Historie und Objektorientierung damit zu tun haben, erschließt sich mir nicht.

                            Das "Feeling" ist schon sehr objektorierentiert,

                            Das kann ich gleich gar nicht nachvollziehen. Objektorientiert heißt, dass sich alles am Objekt orientiert. Selbiges steht im Mittelpunkt und davon abhängig sind die Bearbeitungsverfahren. Das sieht man auch an der Syntax, dass die Eigenschaften und Methoden dem Objekt oder seiner Klasse untergeordnet sind und man nicht selbständigen Funktionen auf der einen Seite und ebensolche Variablen auf der anderen Seite hat, die erst beim Funktionsaufruf zusammenkommen, falls der Compiler sie lässt.

                            weswegen ich ja immer sage, dass entweder Interpreter mit gekapselten Baukästen und Runtimesystem, oder OOP mit Objekten (schlussendlich bis auf Prozessorebene durchkompilierbar), aber nicht beides mischen...

                            Auch hier kann ich keinen Bezug zum Thema sehen. Es fällt mir auch schwer, den Sinn dahinter zu entdecken.

                            Lo!

                            1. Hello,

                              Es ist ein Vorstellungsmodell.
                              Das Vorstellungsmodell als verkette Liste kommt der tatsächlichen Funktionalität und Bedienbarkeit am nächsten.

                              Für mich fühlt es sich eher wie ein Array an, so als ob die Elemente direkt hintereinander liegen. Dass sie in ungeordneter Reihenfolge im Speicher lägen und nur über einen wie auch immer gearteten Mechanismus verbunden wären, kann ich weder von außen sehen, noch kann ich ihn in irgendeiner Form nutzen.

                              Es ist kein Array, denn in einem Array kann man die Position eines Elementes über seinen Index bestimmen. In einem Array kann kein Index fehlen, da dieser sich ja aus der Position ergibt. In einem Array darf man bedenkenlos über den Index iterieren. Das ist in PHP nicht zulässig, da hier Index-Werte fehlen können/dürfen.

                              Ein Array reiht gleichartige Elemente oder Elementegruppen (Mehrdimensionales Array) im Speicher an oder suggeriert dies zumindest nach außen. Die Begriffe "Feld, Matrix, Bereich, Reihe, usw." sind Synonyme für Arrays. Sie beziechnen regelmäßige Elementestrukturen.

                              Der Begriff "Array" für das vorliegende Datenkonstrukt ist in PHP schlichtweg falsch gewählt. Aber damit müssen wir nun leben, da er sich auch als Typbezeichner in der Sprache wiederfindet.

                              Der einzige Typ, der sich nach außen wie ein Array gibt, ist in PHP der (Single-Byte-)String. Multibyte-Strings sind streng genommen bereits keine Arrays mehr bzw. dürften keine mehr sein, da sie wieder unterschiedlich große Elemente anreihen (können).

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bergpost.annerschbarrich.de
                              1. Hi!

                                Es ist kein Array, denn in einem Array kann man die Position eines Elementes über seinen Index bestimmen. In einem Array kann kein Index fehlen, da dieser sich ja aus der Position ergibt. In einem Array darf man bedenkenlos über den Index iterieren. Das ist in PHP nicht zulässig, da hier Index-Werte fehlen können/dürfen.

                                Schon klar, es ist genau hingesehen jedoch ebensowenig ein Array wie eine verkettete Liste. Beiden Modellen fehlen wesentliche Eigenschaften.

                                Vom Array-Modell ist wenigstens der Zugriff über einen Schlüssel geblieben. Von der verketteten Liste sehe ich gar keine Eigenschaft.

                                Ein Array reiht gleichartige Elemente oder Elementegruppen (Mehrdimensionales Array) im Speicher an oder suggeriert dies zumindest nach außen.

                                Das gleichartige Element beim PHP-Array heißt PHP-Variable. Dass diese jeden Typ annehmen kann, ist ein wesentliches Merkmal aller PHP-Variablen, also sind sie in der Hinsicht gleichartig.

                                In anderen Systemen können Arrays auch Strings beliebiger Länge speichern. Diese wären nach deiner Definition auch nicht gleichartig, weil kaum anzunehmen ist, dass für jedes Element der maximal mögliche Speicher reserviert wird. Das Problem löst man, indem man eher Verweise auf Strings speichert. Trotzdem sieht es nach außen hin wie ein Array aus. Das gleiche Prinzip könnte man auf PHP übertragen: Arrays speichern Verweise auf Variablen. Damit sind die Elemente nun wirklich schön gleichartig. Bleibt nur das "Problem" des nicht vorhandenen Index.

                                Der Begriff "Array" für das vorliegende Datenkonstrukt ist in PHP schlichtweg falsch gewählt. Aber damit müssen wir nun leben, da er sich auch als Typbezeichner in der Sprache wiederfindet.

                                Er ist jedenfalls "richtiger" als verkettete Liste. Wenn du es genauer benennen willst, nenn es Dictionary. Ein Synonym dafür ist assoziatives Array. (Hashtabelle, wie ich gestern sagte, trifft es nicht, weil nach außen hin kein Hashing zu sehen ist.)

                                Lo!

                                1. Hallo ihr zwei.

                                  Es ist kein Array, denn in einem Array kann man die Position eines Elementes über seinen Index bestimmen.

                                  Vom Array-Modell ist wenigstens der Zugriff über einen Schlüssel geblieben. Von der verketteten Liste sehe ich gar keine Eigenschaft.

                                  Wikipedia bietet:

                                  1.: Array als Datenstruktur: das sind PHP-Arrays nicht; eine Array-Deklaration im PHP-Skript produziert zur Laufzeit eine verkette Liste (von C-Strukturen).

                                  2.: Array als Datentyp: das sind PHP-Arrays.

                                  Also: Alle haben recht. :-)

                                  Viele Grüße,
                                  der Bademeister

                                  1. Hi!

                                    1.: Array als Datenstruktur: das sind PHP-Arrays nicht; eine Array-Deklaration im PHP-Skript produziert zur Laufzeit eine verkette Liste (von C-Strukturen).

                                    Das kann es ja meinetwegen machen, aber was da im Hintergrund abläuft, kann man als PHP-Programmierer nicht beeinflussen und kann es auch nicht nutzen. Noch eine Ebene drunter bekommt der Prozessor irgendwelchen Maschinencode. Der ist genauso vorhanden wie die verkettete Liste - und hilft noch weniger PHP-Arrays zu erklären. Ich betrachte lediglich was ich sehe. Und da sehe ich nichts von Verkettung, dafür aber einen Index-Zugriff, der nicht zum Model verkettete Liste gehört, also taugt sie nicht als Erklärungsmodell.

                                    Lo!

                                    1. Das kann es ja meinetwegen machen, aber was da im Hintergrund abläuft, kann man als PHP-Programmierer nicht beeinflussen und kann es auch nicht nutzen. [...] Ich betrachte lediglich was ich sehe. Und da sehe ich nichts von Verkettung, dafür aber einen Index-Zugriff, der nicht zum Model verkettete Liste gehört, also taugt sie nicht als Erklärungsmodell.

                                      ACK. Sehe ich genauso.

                                      Viele Grüße,
                                      der Bademeister

                                  2. Hello,

                                    2.: Array als Datentyp: das sind PHP-Arrays.

                                    Diese Bedingungen trefffen auf die "Arrays" in PHP nicht zu.

                                    Insbesondere die Forderung nach geschlossenen Indexen und auch die nachfolgend zitierte Forderung nach Berechnenbarkeit über den Index sind nicht erfüllt.

                                    "Array types are distinguished from record types mainly because they allow the element indices to be computed at run time, as in the Pascal assignment A[I,J] := A[N-I,2*J]. "

                                    Hingegen treffen bei der verketteten Liste fast alle Forderungen zu. Einzig die Forderung, nach einem zentralen Deskriptor/Pointer auf das aktuelle Element (ein einzelnes) des gesamten Baumes ist in PHP nicht erfüllt, da jede (Teil-)Liste des Baumes einen eigenen führt. Man muss hierzu eine Referenz verwenden.

                                    Die (implizite) Forderung von Dedlfix, man müsse auf die internen Verwaltungsinformationen einen Liste / eines Baumes direkten Zugriff haben, ist allerdings falsch. Es ist durchaus richtig, diese zu kapseln und nur über abgesicherte Funktionen / Methoden zugänglich zu machen.

                                    Die Darstellung als Array führt in PHP regelmäßig wieder zu Irritationen und Unverstand. Daher werde ich auch in Zukunft weiter dafür eintreten, die "Arrays" in PHP als verkettete Listen und daraus gebaute Bäume darzustellen. Dies kommt dem Verhalten am nächsten und erledigt alle mir bisher bekannten Vorstellungsprobleme...

                                    Liebe Grüße aus dem schönen Oberharz

                                    Tom vom Berg

                                    --
                                     ☻_
                                    /▌
                                    / \ Nur selber lernen macht schlau
                                    http://bergpost.annerschbarrich.de
                                    1. Hi!

                                      2.: Array als Datentyp: das sind PHP-Arrays.
                                      Diese Bedingungen trefffen auf die "Arrays" in PHP nicht zu.
                                      Insbesondere die Forderung nach geschlossenen Indexen und auch die nachfolgend zitierte Forderung nach Berechnenbarkeit über den Index sind nicht erfüllt.

                                      Die ist für PHP nicht relevant, weil man nicht auf Speicheradressen zugreifen kann, also nützt deren Berechnung auch nichts.

                                      Können wir uns darauf einigen, dass PHP-Arrays Dictionarys mit einer - ohne weiteres Zutun - festen Reihenfolge der Elemente sind?

                                      Hingegen treffen bei der verketteten Liste fast alle Forderungen zu. Einzig die Forderung, nach einem zentralen Deskriptor/Pointer auf das aktuelle Element (ein einzelnes) des gesamten Baumes ist in PHP nicht erfüllt, da jede (Teil-)Liste des Baumes einen eigenen führt. Man muss hierzu eine Referenz verwenden.

                                      Welches sind denn diese "fast alle Forderungen"? Ich sehe von meinem Verständnis der Eigenschaften verketteter Listen eigentlich gar keine.

                                      • (Vorgänger und) Nachfolger von beliebig referenzierten Elementen lässt sich ermitteln - nicht erfüllt.
                                      • Elemente lassen sich ausgehend von beliebig referenzierten Elementen einfügen - nicht erfüllt, (für array_splice() man muss die Positionsnummer kennen).

                                      Die (implizite) Forderung von Dedlfix, man müsse auf die internen Verwaltungsinformationen einen Liste / eines Baumes direkten Zugriff haben, ist allerdings falsch. Es ist durchaus richtig, diese zu kapseln und nur über abgesicherte Funktionen / Methoden zugänglich zu machen.

                                      Diese Funktionen stehen aber nicht zur Verfügung. Wenn das nach außen hin nicht sichtbar ist, dann ist es für mich irrelevant, wie das intern gelöst ist.

                                      Die Darstellung als Array führt in PHP regelmäßig wieder zu Irritationen und Unverstand. Daher werde ich auch in Zukunft weiter dafür eintreten, die "Arrays" in PHP als verkettete Listen und daraus gebaute Bäume darzustellen. Dies kommt dem Verhalten am nächsten und erledigt alle mir bisher bekannten Vorstellungsprobleme...

                                      Aus der intern verwendeten Liste selbst wird kein Baum erstellt, noch wird sie zu einem, wenn man PHP-Arrays schachtelt. Die Elemente der Liste speichern als Nutzlast einen Variablencontainer. Ob dieser nun einen skalaren Wert oder ein Array oder Objekt enthält ist für die Liste nicht relevant. Man kann nicht mit Funktionen, die die Organisation der Liste beträfen, auf diese Unterarrays zugreifen. Es sind die ganz normalen Variablenfunktionen, mit denen man sich weiterbewegen muss. Wenn du dir hingegen mal Nested Sets als Baumstruktur ansiehst, ist die Verschachtlung anhand der Verwaltungsinformationen (L,R) nachvollziehbar.

                                      So ein verschachteltes Gebilde sieht nach außen hin wie ein Baum und manchmal wie ein multidimensionales Array aus, aber dazu brauch ich weder die Lste noch ihre nicht nutzbaren Eigenschaften, um das Gebilde zu erklären.

                                      Lo!

        2. Hello,

          und noch ein Link.
          Hat mir keine Probleme gemacht, dan per Google zu finden:

          Wie wurderst Du in einem Satz die Begriffe erklaeren?

          http://www.phpbar.de/w/Multidimensionales_Array_sortieren

          http://books.google.de/books?id=pTKAwL64NkoC&pg=PA463&lpg=PA463&dq=Spaltenorientiertes+Array&source=bl&ots=kuTcydN67M&sig=IVLFaILO-PNz33zsfskeWs30H-4&hl=de&ei=nelSTfKsJs7Nswby6PncBg&sa=X&oi=book_result&ct=result&resnum=2&ved=0CB8Q6AEwAQ#v=onepage&q&f=false

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
      2. Hi!

        [...] es sei denn, du willst von der zeilenorientierten Organisation zu einer spaltenorientierten wechseln.
        Wie wurderst Du in einem Satz die Begriffe erklaeren?

        Siehe array_multi_sort(), speziell Beispiel #3. Datenbankergebnisse liegen üblicherweise zeilenorientiert vor, ein Datensatz in einem Array. Beim Spaltenarray hat man ein Array pro Feld. Die Zuordnung zum Datensatz ergibt sich über den Schlüssel.

        Lo!

        1. Siehe array_multi_sort(), speziell Beispiel #3.

          Mir ist klar, was gemeint ist. Ich halte nur die Begriffe fuer unsinnig. Die Frage war, ob jemand letzteres aendern kann...

          Datenbankergebnisse liegen üblicherweise zeilenorientiert vor, ein Datensatz in einem Array. Beim Spaltenarray hat man ein Array pro Feld. Die Zuordnung zum Datensatz ergibt sich über den Schlüssel.

          Mir ist klar, was gemeint ist. Aber die Begriffe "Datensatz" und "Feld" hat man (im PHP-Kontext) nicht zur Verfuegung, um die Begriffe "zeilen-" bzw. "spaltenorientiert" zu erklaeren. Das ist das Problem.

          Viele Gruesse,
          der Bademeister

          1. Hi!

            Siehe array_multi_sort(), speziell Beispiel #3.
            Mir ist klar, was gemeint ist. Ich halte nur die Begriffe fuer unsinnig. Die Frage war, ob jemand letzteres aendern kann...

            Was wäre deiner Meinung nach eine sinnvollere Benennung?

            Datenbankergebnisse liegen üblicherweise zeilenorientiert vor, ein Datensatz in einem Array. Beim Spaltenarray hat man ein Array pro Feld. Die Zuordnung zum Datensatz ergibt sich über den Schlüssel.
            Mir ist klar, was gemeint ist. Aber die Begriffe "Datensatz" und "Feld" hat man (im PHP-Kontext) nicht zur Verfuegung, um die Begriffe "zeilen-" bzw. "spaltenorientiert" zu erklaeren. Das ist das Problem.

            Warum sollte ich das Ergebnis einer Fetch-Funktion nicht Datensatz nennen dürfen? In der Ergebnismenge einer DBMS-Abfrage war es noch ein Datensatz. Die Fetch-Funktion übergibt ihn in der bekannten Form als ein Array. Je Datensatz wird also ein Äquivalent in Form eines Arrays geliefert. Dieses Array enthält also eine Zeile aus der Ergebnismenge. Umsortiert in die Spaltenform ergibt es Arrays, die dem Inhalt von Feldern der Ergebnismenge entsprechen. Ich sehe da kein Problem begrifflicherseits.

            Lo!

            1. Warum sollte ich das Ergebnis einer Fetch-Funktion nicht Datensatz nennen dürfen?

              Im OP steht keine Fetch-Funktion und es ist von keiner Datenbank die Rede. Da steht lediglich ein PHP-Array (von Arrays), mehr nicht. Und auf ein solches bezog ich meine Frage.

              Viele Gruesse,
              der Bademeister

              PS: Fussball geguckt? ...so der Antwortzeit nach zu urteilen :-)

            2. Huch, warum hab ich denn die Frage nicht beantwortet?

              Was wäre deiner Meinung nach eine sinnvollere Benennung?

              Wenn es darum geht, wie man etwa Datensätze aus einer Datenbank repräsentiert, *dann* könnte man von so etwas wie Zeilen- oder Spaltenrepräsentierung der Datensätze sprechen. Was dann beschreibt - klar - wie die Datensätze angeordnet sind. (!: Die Repräsentierung ist ..orientiert, nicht das PHP-Array. Vielleicht ein kleinlicher Unterschied, aber um den geht es mir ein bisschen).

              Und natürlich kann hier auch drüber diskutieren, ob das Array-Design des OP gut ist, da spricht ja nichts gegen. Aber ungeachtet dessen geht es (ihm) ja darum, zu verstehen, wie man in PHP das macht, was er machen will.

              Und im reinen Kontext von PHP - man hat ein gegebenes Array und möchte es sortieren - kann man die Begriffe "zeilenorientiert" etc. ersatzlos streichen. Solche Begriffe mogeln sich irgendwie dann heimlich ins Spiel, wenn man von multidimensionalen Arras spricht, aber bei den Sortierungsfragen macht man sich das Leben viel leichter, wenn man das vermeidet. Dann kann man nämlich erheblich klarer formulieren, was man eigentlich will. Man hat entweder

              • ein Array, das man sortieren will (wie der OP) -> (u)sort
              • ein Array, das man *nicht* sortieren will, aber dessen Felder (die Arrays sind) man simultan sortieren will -> array_multisort

              Viele Grüße,
              der Bademeister

              1. Hi!

                Wenn es darum geht, wie man etwa Datensätze aus einer Datenbank repräsentiert, *dann* könnte man von so etwas wie Zeilen- oder Spaltenrepräsentierung der Datensätze sprechen. Was dann beschreibt - klar - wie die Datensätze angeordnet sind. (!: Die Repräsentierung ist ..orientiert, nicht das PHP-Array. Vielleicht ein kleinlicher Unterschied, aber um den geht es mir ein bisschen).

                Wenn du noch mal meine erste Antwort anschaust, dann sprach ich schon von einer Organisation der Daten nicht von einem Array. Diesen Unterschied habe ich also in der Formulierung schon beachtet, auch wenn ich mir dabei weniger Gedanken darüber gemacht habe als in der jetzigen Diskussion.

                Und natürlich kann hier auch drüber diskutieren, ob das Array-Design des OP gut ist, da spricht ja nichts gegen. Aber ungeachtet dessen geht es (ihm) ja darum, zu verstehen, wie man in PHP das macht, was er machen will.

                Und da muss man nicht nur die technische Seite der Arrays betrachten sondern auch die Organisation seiner Daten darin, denn das ist entscheidend für das Verstehen und für das Arbeiten damit, auch abseits von eventuell vereinfachter Sortierung bei einer anderen Anordnung (der Daten in den Arrays). Denn es sind einige Besonderheiten zu berücksichtigen, wie das Beachten der Schlüssel als bindendes Element und dass die Schlüssel-Wert-Zuordnung deswegen nicht verloren gehen darf.

                Und im reinen Kontext von PHP - man hat ein gegebenes Array und möchte es sortieren - kann man die Begriffe "zeilenorientiert" etc. ersatzlos streichen.

                Richtig, nicht das Array ist xy-orientiert, sondern die jeweils eine Einheit bildenden Daten sind xy-orientiert auf die Arrays verteilt. (Und wenn Daten eine Einheit bilden, ist durchaus auch jenseits von DBMSen der Begriff Datensatz populär.) Und um das kurz auszudrücken gibt es statt der Formulierung "Arraystruktur mit zeilen/spaltenorientierter Anordnung der jeweils zusammengehörigen Daten" die Kurzformen Zeilenarray und Spaltenarray (oder englisch: array of rows/columns).

                Solche Begriffe mogeln sich irgendwie dann heimlich ins Spiel, wenn man von multidimensionalen Arras spricht,

                Ich spreche aber nur sehr selten von multidimensionalen Arrays unter PHP, weil es diese rein technisch nicht gibt. Auch hier ist es wieder nur eine Sache der Repräsentation. Es sieht nur multidimensional aus, in Wirklichkeit ist es nur ein Array von Arrays.

                aber bei den Sortierungsfragen macht man sich das Leben viel leichter, wenn man das vermeidet. Dann kann man nämlich erheblich klarer formulieren, was man eigentlich will.

                Der Mensch erfindet spezielle Begriffe, weil er nicht jedes Mal in voller Klarheit den Sachverhelt schildern will. Wenn ihm das Spaß machte, würde ihm ein Binärsystem zur Verständigung reichen. Andererseits sind einem Neuling diese Fachbegriffe nicht geläufig, dann sollte er sie lernen, in seinem eigenen Interesse, denn nur so ist eine effiziente Kommunikation möglich.

                • ein Array, das man sortieren will (wie der OP) -> (u)sort
                • ein Array, das man *nicht* sortieren will, aber dessen Felder (die Arrays sind) man simultan sortieren will -> array_multisort

                Nun weiß ich aber aus der Erfahrung, dass jemand, der solche Fragen stellen muss, sich eher nicht haargenau seine wirklichen technischen Gegebenheiten anschaut, sondern mehr abstrakt auf seine Daten. Und da ist es für das Verständnis doch hilfreich, wenn man dabei die Repräsentationsformen mit berücksichtigt.

                Lo!

                1. Wenn du noch mal meine erste Antwort anschaust[:]

                  es sei denn, du willst von der zeilenorientierten Organisation zu einer spaltenorientierten wechseln.

                  dann sprach ich schon von einer Organisation der Daten nicht von einem Array. Diesen Unterschied habe ich also in der Formulierung schon beachtet,

                  Ja, aber Du sprachst von Zeilen und Spalten von einer imaginaeren Datenbanktabelle oder sonstwas, was es da nicht gab. Da manche Leute in Versuchung kommen, bei Arrays von Arrays auch an sowas wie Zeilen und Spalten zu denken (die dann etwas anderes sind als das, was Du als Zeilen und Spalten bezeichnest), halte ich das fuer verwechslungstraechtig.

                  Und wenn Daten eine Einheit bilden, ist durchaus auch jenseits von DBMSen der Begriff Datensatz populär.

                  Du wuerdest mich jetzt wohl schlagen wollen, wenn ich fragte, was es heisst, dass Daten eine Einheit bilden?

                  Und um das kurz auszudrücken gibt es statt der Formulierung "Arraystruktur mit zeilen/spaltenorientierter Anordnung der jeweils zusammengehörigen Daten" die Kurzformen Zeilenarray und Spaltenarray (oder englisch: array of rows/columns).

                  Unter Zeilenarray und Spaltenarray verstehe ich das Array-Design im Speicher (englisch zumeist row major/column major array), und das waere eine vollkommen andere Baustelle. Wenn row array/column array wirklich etwas *voellig* anderes als row major/column major array bedeuten sollte, dann sind die Begriffe meines Erachtens ausgesprochen schlecht gewaehlt.

                  Viele Gruesse,
                  der Bademeister

                  1. Hi!

                    Und um das kurz auszudrücken gibt es statt der Formulierung "Arraystruktur mit zeilen/spaltenorientierter Anordnung der jeweils zusammengehörigen Daten" die Kurzformen Zeilenarray und Spaltenarray (oder englisch: array of rows/columns).
                    Unter Zeilenarray und Spaltenarray verstehe ich das Array-Design im Speicher (englisch zumeist row major/column major array), und das waere eine vollkommen andere Baustelle.

                    Kann sein, und da wir auf dieser Baustelle grad nicht sind, ist das für das aktuelle Problem nicht weiter interessant.

                    Wenn row array/column array wirklich etwas *voellig* anderes als row major/column major array bedeuten sollte, dann sind die Begriffe meines Erachtens ausgesprochen schlecht gewaehlt.

                    Und nun? Es ist nun mal so, dass Begriffe in verschiedenen Kontexten mitunter etwas anderes meinen. Hier hat sich der Begriff Kontextwechsel etabliert, bei CPUs bedeutet er aber etwas anderes. Und du wirst jede Menge Wörter in der Alltagssprache finden, die je nach Kontext etwas anderes beschreiben. Üblicherwiese sind die Menschen so schlau diese doppelten Verwendungen je nach Zusammenhang auseinanderhalten zu können.

                    Lo!