j4nk3y: reset() von zwei foreach Schleifen

Tag zusammen,

Sitze grad an was echt blödem und komme nicht auf die Lösung. Ich weiss das man sowas vllt nicht machen sollte aber das ist gerade notwendig.

Folgendes Problem:

foreach($arr as key_1 => $value_1)
	{
		foreach($arr as key_2 => $value_2)
		{
                        if($key_1 != $key_2)
                        {
			        if($value_1['x'] === $value_2['x'] AND 
                                   $value_1['y'] === $value_2['y'] AND 
                                   $value_1['z'] === $value_2['z'])
			        {
				        $new_x = gauss($radius,$center['x'],1);
				        $new_y = gauss($radius,$center['y'],1);
				        $new_z = gauss($radius,$center['z'],1);
				        reset($arr);
			        }
                        }

		}

Das reset($arr) sollte ja den internen zeiger der 2ten foreach-Schleife wieder auf das erste Element setzen. Aber wie sieht das mit der ersten foreach-Schleife aus? (Das möchte ich auch, also das beide foreach-Schleifen wieder von vorne Anfangen).

Werden Beide foreach-Schleifen durch das reset() tangiert wenn die Bedingung zutrifft? Und wenn nicht wie stelle ich das an?

Gruß Jo

  1. Tach!

    Das reset($arr) sollte ja den internen zeiger der 2ten foreach-Schleife wieder auf das erste Element setzen. Aber wie sieht das mit der ersten foreach-Schleife aus?

    foreach interessiert sich nicht für den Array-Zeiger, es geht generell und unabhängig von anderen Iterationen desselben Arrays alle Einträge durch. reset() wirkt nur auf die Ergebnisse der Funktionen current(), each(), next() und prev().

    (Das möchte ich auch, also das beide foreach-Schleifen wieder von vorne Anfangen).

    Dafür kannst du foreach nicht verwenden.

    dedlfix.

    1. Tach!

      Das reset($arr) sollte ja den internen zeiger der 2ten foreach-Schleife wieder auf das erste Element setzen. Aber wie sieht das mit der ersten foreach-Schleife aus?

      foreach interessiert sich nicht für den Array-Zeiger, es geht generell und unabhängig von anderen Iterationen desselben Arrays alle Einträge durch. reset() wirkt nur auf die Ergebnisse der Funktionen current(), each(), next() und prev().

      Hm, irgendwo hatte ich sowas schonmal gefunden... Möglich, dass das nicht reset() war, sondern was anderes.

      (Das möchte ich auch, also das beide foreach-Schleifen wieder von vorne Anfangen).

      Dafür kannst du foreach nicht verwenden.

      Öhm, was dann?

      Gruß Jo

      1. Moin,

        foreach interessiert sich nicht für den Array-Zeiger, es geht generell und unabhängig von anderen Iterationen desselben Arrays alle Einträge durch. reset() wirkt nur auf die Ergebnisse der Funktionen current(), each(), next() und prev().

        Hm, irgendwo hatte ich sowas schonmal gefunden... Möglich, dass das nicht reset() war, sondern was anderes.

        Vielleicht war es eine for-Schleife und der Schleifenindex wurde wieder auf 0 gesetzt.

        Schönen Sonntag Robert

        1. Moin,

          foreach interessiert sich nicht für den Array-Zeiger, es geht generell und unabhängig von anderen Iterationen desselben Arrays alle Einträge durch. reset() wirkt nur auf die Ergebnisse der Funktionen current(), each(), next() und prev().

          Hm, irgendwo hatte ich sowas schonmal gefunden... Möglich, dass das nicht reset() war, sondern was anderes.

          Vielleicht war es eine for-Schleife und der Schleifenindex wurde wieder auf 0 gesetzt.

          Ne, das war foreach, da stand dann noch als kommentar im Manual das, die funktion in php 7 nicht mehr implementiert ist, worüber ich mich noch tierisch aufgeregt hab. Naja wie auch immer.

          Gruß Jo

      2. Tach!

        Hm, irgendwo hatte ich sowas schonmal gefunden... Möglich, dass das nicht reset() war, sondern was anderes.

        Möglich, aber nicht im Zusammenhang mit foreach. Da gibts nur break und continue, aber keinen Neustart.

        Dafür kannst du foreach nicht verwenden.

        Öhm, was dann?

        Alles andere, mit dem man durch Arrays laufen und dabei selbst bestimmen kann, welches Element aktuell sein soll. Da fallen mir ein: for, die in meiner ersten Antwort genannten Funktionen und eigene Algorithmen mit while/do-while.

        dedlfix.

        1. Tach!

          Hm, irgendwo hatte ich sowas schonmal gefunden... Möglich, dass das nicht reset() war, sondern was anderes.

          Möglich, aber nicht im Zusammenhang mit foreach. Da gibts nur break und continue, aber keinen Neustart.

          Da bin ich mir eigentlich sicher aber ich finde es auch nicht wieder, möglich das mein gedächtnis mir einen Streich spielt.

          Dafür kannst du foreach nicht verwenden.

          Öhm, was dann?

          Alles andere, mit dem man durch Arrays laufen und dabei selbst bestimmen kann, welches Element aktuell sein soll. Da fallen mir ein: for, die in meiner ersten Antwort genannten Funktionen und eigene Algorithmen mit while/do-while.

          also in etwa so?

           for($i=0,$i<=count($arr),$i++)
           	{
           		for($e=0,$e<=count($arr),$e++)
           		{
                                   if($i != $e)
                                   {
           			        if($arr[$e]['x'] === $arr[$i]['x'] AND 
                                              $arr[$e]['y'] === $arr[$i]['y'] AND 
                                              $arr[$e]['z'] === $arr[$i]['z'])
           			        {
           				        $arr[$e]['x'] = gauss($radius,$center['x'],1);
           				        $arr[$e]['y'] = gauss($radius,$center['y'],1);
           				        $arr[$e]['z'] = gauss($radius,$center['z'],1);
           				        $i=0;
           				        $e=0;
           				        break;
           			        }
                                   }
           
           		}
          

          Gruß Jo

          1. Tach!

            also in etwa so?

            Tut es exakt das was du möchtest? Ich kann dir für deinen Code keine Absolution erteilen, du musst den schon selbst testen und gegebenenfalls debuggen. Wenn du konkrete Fragen hast, dann stell sie. Ich kann mir vorstellen, dass das Setzen der Laufvariable auf 0 - genauer gesagt, das was am Schleifenende mit der Laufvariable geschieht - nicht ganz das macht, was du dir vorgestellt hast.

            dedlfix.

            1. Tach!

              Tut es exakt das was du möchtest?

              Keine Ahunung, da es ziemlich selten vorkommt das die funktion was machen muss. x,y,z werden durch die Box-Muller-Methode generiert, normalerweise in einem bereich von 0-500 oder 0~1000. Sprich es gibt 500^3 oder 1000^3 Mögliche Kombinationen, sicher im bereich von 1*sigma, wirds bissl eng aber das sind immer noch ~160^3 mögliche Kombinationen. Sprich, bis die Wahrscheinlichkeit so groß wird das die Funktion etwas ändert, müssen schon eine ganze Menge Datensätze vorhanden sein. Und ich weiß nicht wie das dann mit dem Array zwischenspeichern aussieht. Bei 2 Millionen Datensätzen will er aufjedenfall nicht mehr, dass war aber auch nur ein extrem Test der wohl nie eintritt.

              Ich kann dir für deinen Code keine Absolution erteilen, ...

              Schade, das wär doch mal was.

              Ich kann mir vorstellen, dass das Setzen der Laufvariable auf 0 - genauer gesagt, das was am Schleifenende mit der Laufvariable geschieht - nicht ganz das macht, was du dir vorgestellt hast.

              Hm, müsste doch aber. Die werden beide auf null gesetzt und das break; beendet die innere Schleife, sodass die äußere Schleife wieder bei 0 anfängt.

              Gruß Jo

              1. Hallo,

                Ich kann mir vorstellen, dass das Setzen der Laufvariable auf 0 - genauer gesagt, das was am Schleifenende mit der Laufvariable geschieht - nicht ganz das macht, was du dir vorgestellt hast.

                Hm, müsste doch aber. Die werden beide auf null gesetzt und das break; beendet die innere Schleife, sodass die äußere Schleife wieder bei 0 anfängt.

                wenn es das ist, was du willst - ja, das würde wohl funktionieren. Die Laufvariable der inneren Schleife brauchst du aber nicht auf 0 zurückzusetzen, wenn du die Schleife mit break abbrichst. Das geschieht automatisch, wenn der Schleifenkopf (die for-Anweisung) das nächste Mal erreicht wird.

                Allerdings haben die for-Schleifenköpfe in deinem Codebeispiel einen gravierenden Fehler: Die drei Anweisungen im Schleifenkopf sind durch Komma getrennt, nicht durch Semikolon. Das ist sowohl ein inhaltlicher wie auch ein syntaktischer Fehler.

                So long,
                 Martin

                --
                Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                1. Hallo,

                  [Vollzitat]

                  Allerdings haben die for-Schleifenköpfe in deinem Codebeispiel einen gravierenden Fehler: Die drei Anweisungen im Schleifenkopf sind durch Komma getrennt, nicht durch Semikolon. Das ist sowohl ein inhaltlicher wie auch ein syntaktischer Fehler.

                  Ja, schon gemerkt, Danke. Der Vergleichoperator ist auch Falsch das darf nur ein < sein, da das Array ja bei 0 anfängt.

                  Gruß Jo

              2. Tach!

                Tut es exakt das was du möchtest?

                Keine Ahunung,

                Nicht gut, wenn man was programmieren möchte.

                da es ziemlich selten vorkommt das die funktion was machen muss.

                Man kann (und sollte) solche Fälle auch mit Testdaten testen. Modulares Programmieren (mit Funktionen zum Beispiel) zahlt sich dabei aus, weil man dann den Code sehr einfach öfter aufrufen kann. Zudem definiert eine Funktion eine exakte Schnittstelle (wenn man nicht gerade unter Verwendung von $GLOBALS eine Nebenläufigkeit programmiert).

                Ich kann mir vorstellen, dass das Setzen der Laufvariable auf 0 - genauer gesagt, das was am Schleifenende mit der Laufvariable geschieht - nicht ganz das macht, was du dir vorgestellt hast.

                Hm, müsste doch aber. Die werden beide auf null gesetzt und das break; beendet die innere Schleife, sodass die äußere Schleife wieder bei 0 anfängt.

                Das break beendet die innere Schleife. Soweit so richtig. Aber die äußere läuft weiter und macht genau das, was sie immer macht: an ihrem Ende den dritten Term ausführen.

                dedlfix.

                1. Tach!

                  Tut es exakt das was du möchtest?

                  Keine Ahunung,

                  Nicht gut, wenn man was programmieren möchte.

                  Bin gerade am Probieren mit manipulierten Testdaten.

                  Ich kann mir vorstellen, dass das Setzen der Laufvariable auf 0 - genauer gesagt, das was am Schleifenende mit der Laufvariable geschieht - nicht ganz das macht, was du dir vorgestellt hast.

                  Hm, müsste doch aber. Die werden beide auf null gesetzt und das break; beendet die innere Schleife, sodass die äußere Schleife wieder bei 0 anfängt.

                  Das break beendet die innere Schleife. Soweit so richtig. Aber die äußere läuft weiter und macht genau das, was sie immer macht: an ihrem Ende den dritten Term ausführen.

                  Ja, das soll sie ja auch und zwar wieder bei 0 Anfangen und bis zum Ende laufen.

                  Gruß Jo

                  1. Tach!

                    Das break beendet die innere Schleife. Soweit so richtig. Aber die äußere läuft weiter und macht genau das, was sie immer macht: an ihrem Ende den dritten Term ausführen.

                    Ja, das soll sie ja auch und zwar wieder bei 0 Anfangen und bis zum Ende laufen.

                    Dann probier das mal an einer kleinen Teststellung. Bei 0 fängt sie nämlich nicht wieder an.

                    dedlfix.

                    1. Morgen,

                      Das break beendet die innere Schleife. Soweit so richtig. Aber die äußere läuft weiter und macht genau das, was sie immer macht: an ihrem Ende den dritten Term ausführen.

                      Ja, das soll sie ja auch und zwar wieder bei 0 Anfangen und bis zum Ende laufen.

                      Dann probier das mal an einer kleinen Teststellung. Bei 0 fängt sie nämlich nicht wieder an.

                      Wieso fängt die äußere nicht wieder bei 0 an? $i wird doch auf null gesetzt. Das bestätigt auch ein kleiner Log.

                      Hier kommt auch gleich eine Kleine Denksport Aufgabe:

                      ID : 11716

                      X : 146 = 146 -> 220

                      Y : 165 = 165 -> 242

                      Z : 242 = 242 -> 256

                      ID : 10635

                      X : 211 = 211 -> 174

                      Y : 246 = 246 -> 190

                      Z : 195 = 195 -> 265

                      ID : 22031

                      X : 235 = 235 -> 215

                      Y : 235 = 235 -> 190

                      Z : 156 = 156 -> 202

                      ID : 4070

                      X : 227 = 227 -> 253

                      Y : 240 = 240 -> 183

                      Z : 181 = 181 -> 162

                      ID : 21333

                      X : 208 = 208 -> 238

                      Y : 195 = 195 -> 211

                      Z : 199 = 199 -> 219

                      Das steht z.B in einer Log Datei, die aufzeichnet welche gefundenen Übereinstimmungen gefunden wurden und wie sie geändert wurden. Man sieht das der zweite Eintrag eine kleinere ID hat. Sprich die Schleife sollte wieder von vorne Beginnen. Sehr Merkwürdig finde ich nur, dass Wenn die Schleife schoneinmal über diese ID gelaufen ist und x,y,z nicht mit dem geänderten Wert davor übereinstimmen, warum wurde das nicht schon vorher geändert?

                      Falls das jmd versteht... bitte gern. Ansonsten bin ich fast soweit den Datensatz einfach zu Löschen falls eine übereinstimmung gefunden wurde, sonst dauert das einfach zu lange und benötigt zuviele Ressourcen.

                      Gruß Jo

                      1. Tach!

                        Wieso fängt die äußere nicht wieder bei 0 an? $i wird doch auf null gesetzt. Das bestätigt auch ein kleiner Log.

                        Ja, natürlich wird $i auf 0 gesetzt. Das ist nicht der Punkt. Der Punkt ist das Ende der äußeren Schleife. Steht da ein $i++ oder nicht? Du kannst nicht verhindern, dass diese Schleifenanweisung abgearbeitet wird. Wenn du $i auf 0 setzt, beendet sich die äußere Schleife mit $i++ und die nächste Runde geht mit 1 weiter.

                        dedlfix.

                        1. Tach!

                          Wieso fängt die äußere nicht wieder bei 0 an? $i wird doch auf null gesetzt. Das bestätigt auch ein kleiner Log.

                          Ja, natürlich wird $i auf 0 gesetzt. Das ist nicht der Punkt. Der Punkt ist das Ende der äußeren Schleife. Steht da ein $i++ oder nicht? Du kannst nicht verhindern, dass diese Schleifenanweisung abgearbeitet wird. Wenn du $i auf 0 setzt, beendet sich die äußere Schleife mit $i++ und die nächste Runde geht mit 1 weiter.

                          Die soll ja auch nicht beendet werden sondern wieder vorn vorne, sprich bei 0, anfangen bis sie keine übereinstimmung mehr findet, sprich $i = count($arr) - 1 oder eben $i < count($arr) . Glaub das hast du falsch verstanden.

                          Verstehs aber gerade nicht, es werden immer mehr Übereinstimmungen gefunden, auch bei Werten die die Schleifen schon verglichen hat.

                          Gruß Jo

                          1. Hi,

                            Ja, natürlich wird $i auf 0 gesetzt. Das ist nicht der Punkt. Der Punkt ist das Ende der äußeren Schleife. Steht da ein $i++ oder nicht? Du kannst nicht verhindern, dass diese Schleifenanweisung abgearbeitet wird. Wenn du $i auf 0 setzt, beendet sich die äußere Schleife mit $i++ und die nächste Runde geht mit 1 weiter.

                            Die soll ja auch nicht beendet werden sondern wieder vorn vorne, sprich bei 0, anfangen

                            das tut sie aber nicht. Nur der Rest des Durchlaufs vom Nullsetzen bis zum Ende des Schleifenrumpfes läuft mit $i=0. Zu Beginn des nächsten Durchlaufs wird $i aber auf 1 incrementiert.

                            So long,
                             Martin

                            --
                            Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                            - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                            1. Tach!

                              Zu Beginn des nächsten Durchlaufs wird $i aber auf 1 incrementiert.

                              Hier sollte man es etwas genauer (mit dem Formulieren) nehmen. Nicht der Beginn eines Durchlaufs ist der Ausführungszeitpunkt des dritten Terms, sondern das Ende. Sonst würde die Schleife auch beim ersten Mal schon mit 1 starten.

                              dedlfix.

                              1. Hallo,

                                Zu Beginn des nächsten Durchlaufs wird $i aber auf 1 incrementiert.

                                Hier sollte man es etwas genauer (mit dem Formulieren) nehmen. Nicht der Beginn eines Durchlaufs ist der Ausführungszeitpunkt des dritten Terms, sondern das Ende.

                                ja, das stimmt. Guter Punkt.
                                Klingt nach Erbsenzählerei, kann aber je nach Situation wichtig sein.

                                Sonst würde die Schleife auch beim ersten Mal schon mit 1 starten.

                                Genau. Und die Laufvariable hätte nach der Schleife noch den Wert des letzten Durchlaufs. Hat sie aber nicht, sondern sie ist um ein Increment weiter.

                                Ciao,
                                 Martin

                                --
                                Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                                - Douglas Adams, The Hitchhiker's Guide To The Galaxy
                            2. Moin,

                              das tut sie aber nicht. Nur der Rest des Durchlaufs vom Nullsetzen bis zum Ende des Schleifenrumpfes läuft mit $i=0. Zu Beginn des nächsten Durchlaufs wird $i aber auf 1 incrementiert.

                              Hä? Ok, kurzer umriss des Ablaufs.

                              Die äußere Schleife beginnt bei $i=0 (Erstes Arrayelement) und fürhrt das erste mal die Innere Schleife aus welche bei $e=0(Erstes Arrayelement) startet. Wenn jetzt $e != $i, Wird geprüft ob xi == xe und yi == ye und zi == ze. Falls die innere Schleife keine übereinstimmung findet wirkt $i++. Wenn die Bedingung jedoch irgendwann erfüllt ist wird $i=0 gesetzt und das break; sorgt für den Abbruch der Inneren Schleife. Nun Beginnt Die äußere Schleife wieder bei $i=0 und springt damit wieder auf das erste Arrayelement.

                              Auszug aus dem Manual:

                              Der erste Ausdruck (expr1) wird vor Ausführung der Schleife ausgeführt.

                              Am Anfang jedes Schleifendurchlaufs wird die Anweisung expr2 ausgeführt. Wenn diese wahr ist (TRUE), >wird die Schleife fortgesetzt und die untergeordneten Anweisungen werden ausgeführt. Andernfalls >(FALSE) endet die Ausführung der Schleife.

                              Am Ende jedes Schleifendurchlaufs wird die Anweisung expr3 ausgeführt.

                              $i++ sollte somit erst nach dem ersten Schleifen durchlauf wo $i wieder Null ist, ausgeführt werden und $i inkrementieren.

                              Oder bin ich gerade völlig deppert?

                              Gruß Jo

                              p.s. Mal nebenbei, wie funktioniert ein einfacher Zeilenumbruch? Ist mir gerade aufgefallen das ein einfaches Enter keine neue Zeile im Beitrag sondern nur im Formular Feld erzeugt.

                              1. Moin Jo,

                                Oder bin ich gerade völlig deppert?

                                Ja bist du, geh erstmal duschen!

                                Gruß Jo

                              2. Tach!

                                Hä?
                                Ok, kurzer umriss des Ablaufs.

                                Der Mechanismus einer for-Schleife arbeitet ganz unabhängig davon, was du in ihrem Inneren anstellst.

                                Am Ende jedes Schleifendurchlaufs wird die Anweisung expr3 ausgeführt.

                                $i++ sollte somit erst nach dem ersten Schleifen durchlauf wo $i wieder Null ist, ausgeführt werden und $i inkrementieren.

                                Nach jedem Schleifendurchlauf passiert das.

                                p.s. Mal nebenbei, wie funktioniert ein einfacher Zeilenumbruch?

                                Zwei Leerzeichen ans Ende setzen. Oberhalb des Eingabefeldes gibt es einen Link zur Bedienungsanleitung.

                                dedlfix.

                                1. Moin,

                                  Am Ende jedes Schleifendurchlaufs wird die Anweisung expr3 ausgeführt.

                                  $i++ sollte somit erst nach dem ersten Schleifen durchlauf wo $i wieder Null ist, ausgeführt werden und $i inkrementieren.

                                  Nach jedem Schleifendurchlauf passiert das.

                                  Ja, das hatte ich vollkommen übersehen. Danke.

                                  p.s. Mal nebenbei, wie funktioniert ein einfacher Zeilenumbruch?

                                  Zwei Leerzeichen ans Ende setzen. Oberhalb des Eingabefeldes gibt es einen Link zur Bedienungsanleitung.

                                  Stimmt, Trotzdem Danke!

                                  Gruß Jo

                          2. Tach!

                            Die soll ja auch nicht beendet werden [...] Glaub das hast du falsch verstanden.

                            Nein, bestimmt nicht, nur anscheinend nicht ganz eindeutig beschrieben, was ich meinte.

                            Beendet war hier als Ende des aktuellen Durchlaufs gemeint, dass also die Anweisungen in ihrem Schleifenkörer abgearbeitet worden sind. Zwischen diesem Ende des Durchlaufs und der nächsten Runde liegt da dieses $i++.

                            dedlfix.

                            1. Moin,

                              Die soll ja auch nicht beendet werden [...] Glaub das hast du falsch verstanden.

                              Nein, bestimmt nicht, nur anscheinend nicht ganz eindeutig beschrieben, was ich meinte.

                              Beendet war hier als Ende des aktuellen Durchlaufs gemeint, dass also die Anweisungen in ihrem Schleifenkörer abgearbeitet worden sind. Zwischen diesem Ende des Durchlaufs und der nächsten Runde liegt da dieses $i++.

                              Shit, kapiert, also müsste ich $i auf -1 setzen. Danke!

                              Gruß Jo

                      2. Morgen,

                        Sehr Merkwürdig finde ich nur, dass Wenn die Schleife schoneinmal über diese ID gelaufen ist und x,y,z nicht mit dem geänderten Wert davor übereinstimmen, warum wurde das nicht schon vorher geändert?

                        Falls das jmd versteht... bitte gern.

                        Jetzt hab ichs verstanden... manchmal braucht Man auch einfach nur frühstücken, duschen und ein kleinen spaziergang um wieder einen klaren Kopf zu kriegen...

                        Gruß Jo

  2. Moin!

    Tag zusammen,

    Sitze grad an was echt blödem und komme nicht auf die Lösung. Ich weiss das man sowas vllt nicht machen sollte aber das ist gerade notwendig.

    Du hast hier ein klassisches XY-Problem vorliegen: Du glaubst, dass du Problem X hast, und dass Y die Lösung wäre, aber irgendwie nicht funktioniert, und fragst nun für Y nach Hilfe.

    Die Lösungen für Y führen dich aber nach meinem Ermessen nicht ans Ziel. Warum fragst du nicht nach einer Lösung für X?

    Folgendes Problem:

    Das ist kein Problem, sondern ein Algorithmus. Was soll der machen? Also was soll fachlich dabei rauskommen? Box-Muller-Zufallsmethode hast du schon erwähnt. Warum willst du alle Elemente des Arrays mit allen anderen Elementen des Arrays vergleichen? Was macht die Funktion gauss()?

    foreach($arr as key_1 => $value_1)
    	{
    		foreach($arr as key_2 => $value_2)
    		{
                            if($key_1 != $key_2)
                            {
    			        if($value_1['x'] === $value_2['x'] AND 
                                       $value_1['y'] === $value_2['y'] AND 
                                       $value_1['z'] === $value_2['z'])
    			        {
    				        $new_x = gauss($radius,$center['x'],1);
    				        $new_y = gauss($radius,$center['y'],1);
    				        $new_z = gauss($radius,$center['z'],1);
    				        reset($arr);
    			        }
                            }
    
    		}
    

    Das Problem mit deinem Algorithmus ist, dass er quadratische Laufzeit aufweist. Selbst wenn nichts zu tun ist, muss er für eine Anzahl i von Arrayelementen genau i^2 Schleifendurchläufe machen. Kein Wunder, dass da bei 2 Millionen Arrayeinträgen nichts mehr geht.

    Allerdings gibt es eine sehr wichtige Eigenschaft: Das, was zu tun ist, soll nur passieren, wenn die Werte für X und Y und Z gleich sind. Man kann also grundsätzlich das Array mindestens mal nach X, lieber aber nach allen drei Werten sortieren, weil dann die Abfrage "nur noch" prüfen muss, ob das Arrayelement i dieselben Werte für X, Y und Z hat, wie das Arrayelement i+1. Und das wären dann keine zwei ineinander verschachtelte Schleifen mit quadratischer Laufzeit, sondern nur noch EINE Schleife mit linearer Laufzeit.

    Da du aber leider nicht sagst, was das Array eigentlich enthält, musst du halt mit der enorm schnell wachsenden quadratischen Laufzeit leben.

    Grüße Sven

    1. Sortieren ist bestimmt eine gute Idee. PHP sortiert mit Quicksort, d.h. du kannst dabei von einer Laufzeit im Bereich O(n log(n)) ausgehen. Natürlich ist es auch so, dass man Laufzeitkomplexität nicht mit realer Laufzeit vergleichen darf, so dass Du also ein n haben wirst, unterhalb dessen deine brute force Schleife schneller fertig ist als die Sortierlösung.

      Wenn Du tatsächlich mit riesigen Punktewolken arbeiten willst, könntest Du noch einen Bucketizer vorschalten: Du erzeugst einen Punkt und hängst ihn je nach Wert von ['x'] in eins von beispielsweise 4 Teil-Arrays. Damit viertelst Du (asymptotisch) die Laufzeit des Sort, viertelst die Laufzeit des Kollisionstests UND du reduzierst die Größe des Speicherblocks, den das Array beansprucht, was PHPs Speicherverwaltung sicherlich gut gefallen wird. Die Grenzwerte, nach denen ein Punkt verteilt wird, musst Du entsprechend deiner Wertebereiche festlegen, um eine in etwa gleichmäßige Verteilung zu erreichen. Das Bucketizing hat natürlich auch Laufzeit, aber lineare Komplexität. Je mehr Buckets, desto langsamer; es ist also ein Balanceakt und im Zweifelsfall musst Du mit den für Dich relevanten Datenmengen ausprobieren, was lohnt und was nicht. Wenn Deine Koordinaten gleichmäßig um Null herum verteilt sind, könntest Du vier Eimer nach Quadranten in der XY-Ebene bilden, oder acht Eimer gemäß der Raum-Oktanten. Dann brauchst Du nur die Koordinaten auf "<0" testen, d.h. kannst mit 2 Tests auf 4 Eimer verteilen oder mit 3 Tests auf 8 Eimer.

      Wichtig ist auch, dass Du nicht nach jeder Kollision von vorn beginnst. Damit wiederholst Du viel zu oft Prüfungen, deren Ergebnis Du bereits kennst. Statt dessen sortiere einmal und gehe dann, wie von Sven beschrieben, einmal linear durch. Erkannte Kollisionen markierst Du lediglich (mit einer hinreichend schlauen Methode, da fällt Dir bestimmt was ein). Wenn Du am Ende N kollidierende Punkte gefunden hast, dann erzeugst Du N neue, prüfst die erst einmal untereinander auf Kollisionsfreiheit und dann auf Kollision mit dem Rest der Punktewolke. Diesen Kollisionstest sollst Du NICHT so durchführen, dass Du die neuen Punkte an Dein Array anhängst, einen usort() darauf machst und dann den Kollisionstest erneut durchführst. Grund: Du erwartest nur sehr wenige Kollisionen. Deshalb ist es besser, wenn Du für jede Ersatzzahl eine einfache foreach-Schleife durch das Array mit den bestehenden Punkten laufen lässt (bei Einsatz eines Bucketizers natürlich im richtigen Teil-Array). Wenn das Punktearray sortiert ist, kannst Du dieses Suchen durch eine binäre Suche von O(n) auf O(log n) beschleunigen.

      Und vielleicht ist die Kollisionsbeseitigung auch viel einfacher, wenn Du gleich zu Anfang ein paar Punkte mehr erzeugst als Du nachher brauchst. Bei der Doublettensuche markierst Du die doppelten Punkte nur und reduzierst das Array dann auf die nicht markierten Punkte. Es ist auch die Frage, ob du für deinen Anwendungsfall unbedingt genau N Punkte brauchst. Wenn Du bei N erzeugten Punkten einen Doublettenanteil von 0,01% hast - kannst Du die nicht einfach wegwerfen und dann mit 99.99% von N weitermachen statt die fehlenden Punkte aufwändig nachzugenerieren?

      Gruß Rolf

      1. Moin Rolf,

        Danke für deine Ausführlichkeit, im Ansatz hab ich das schön ähnlich umgesetzt, arbeite aber noch weiter daran. Aber Sehr gute Ansätze, Danke dir!

        Es ist auch die Frage, ob du für deinen Anwendungsfall unbedingt genau N Punkte brauchst. Wenn Du bei N erzeugten Punkten einen Doublettenanteil von 0,01% hast - kannst Du die nicht einfach wegwerfen und dann mit 99.99% von N weitermachen statt die fehlenden Punkte aufwändig nachzugenerieren?

        Das hab ich mir auch schon überlegt. Da hast du vollkommen recht und das wird dann auch der letzte Ausweg sein wenn alles andere scheitert.

        Gruß Jo

    2. Moin!

      Die Lösungen für Y führen dich aber nach meinem Ermessen nicht ans Ziel. Warum fragst du nicht nach einer Lösung für X?

      Dafür müsste ich ersteinmal sehen, dass ich Problem X habe.

      Also was soll fachlich dabei rauskommen?

      Die Raumkoordinate überprüfen.

      Box-Muller-Zufallsmethode hast du schon erwähnt. [...] Was macht die Funktion gauss()?

      Die Box-Muller-Methode erzeugt aus Gleichverteitleten Zufallszahlen Normalverteilte auch Gauss-Normalverteilte gennant. Das macht die Funktion gauss().

      Warum willst du alle Elemente des Arrays mit allen anderen Elementen des Arrays vergleichen?

      Weil nicht Zwei Objekte den gleichen Punkt einnehmen können bzw. sollten. Das könnte ich zwar auch realisieren aber da fehlt mir immoment noch die Motivation zu, dass mach ich vielleicht später.

      Das Problem mit deinem Algorithmus ist, dass er quadratische Laufzeit aufweist.

      Jup, das sieht so aus. das war und ist mir aber durchaus bewusst.

      Allerdings gibt es eine sehr wichtige Eigenschaft: Das, was zu tun ist, soll nur passieren, wenn die Werte für X und Y und Z gleich sind. Man kann also grundsätzlich das Array mindestens mal nach X, lieber aber nach allen drei Werten sortieren, weil dann die Abfrage "nur noch" prüfen muss, ob das Arrayelement i dieselben Werte für X, Y und Z hat, wie das Arrayelement i+1. Und das wären dann keine zwei ineinander verschachtelte Schleifen mit quadratischer Laufzeit, sondern nur noch EINE Schleife mit linearer Laufzeit.

      Da hatte ich noch garnicht dran gedacht, Danke! Obwohl ich das händisch genauso in der Datenbank mache wenn ich Stichprobenartig mal rein schaue.

      Da du aber leider nicht sagst, was das Array eigentlich enthält, musst du halt mit der enorm schnell wachsenden quadratischen Laufzeit leben.

      Das Array enthält Arrays mit X,Y und Z , sprich array([0]=>array([x]=>??? [y]=>??? [z]=>???)[1]=>array([x]=>??? [y]=>??? [z]=>???)....)

      Gruß Jo

  3. Tag zusammen,

    So ich habe mal etwas umgeschrieben und bekomme eine komische Fehlermeldung mit der ich, auch nach längerem suchen, nichts anfangen kann:

    	$fraction = ($radius_1 / 50) + 1;
    	
    	for($a = 0 ; $a <= $fraction ; $a++)
    	{
    		$b = ($a * 50) + 50;
    		
    		include('db_connect_function.php');
    	
    		
    	
    		$select = "Select id,x,y,z From position 
    				WHERE x > $a AND x < $b
    				ORDER BY x ASC , y ASC , z ASC";
    	
    		if($position = $db->query($select))
    		{
    			
    			$objects =  "object_".$a."_".$b;
    			
    			$$objects = array();
    			
    			while($object = $position->fetch_assoc())
    			{
    				array_push($$objects , $object);
    			}
    			
    			echo "$$objects";
    			print_r($$objects);
    			echo "<br><br>";
    			// Close database connection
    			
    			$db->close();
    		}
    		else
    		{
    			log_error_function("","126 , 128",mysqli_error($db),"System");
    		}
    		
    		for($i=0 ; $i<count($$objects) ; $i++)
    		{
    			$e = $i + 1; 
    			
    			if($$objects[$e]['x'] == $$objects[$i]['x'] AND $$objects[$e]['y'] == $$objects[$i]['y'] AND $$objects[$e]['z'] == $$objects[$i]['z'])
    			{
    				include('db_connect_function.php');
    				
    				$old_object_position_x = $$objects[$e]['x'];
    				$old_object_position_y = $$objects[$e]['y'];
    				$old_object_position_z = $$objects[$e]['z'];
    				
    				$same_object_position_x = $$objects[$i]['x'];
    				$same_object_position_y = $$objects[$i]['y'];
    				$same_object_position_z = $$objects[$i]['z'];
    				
    				$$objects[$e]['x']=gauss_object_position($radius_1,$center_1['x'],1);
    				$$objects[$e]['y']=gauss_object_position($radius_1,$center_1['y'],1);
    				$$objects[$e]['z']=gauss_object_position($radius_1,$center_1['z'],1);
    				
    				$new_object_position_x = $$objects[$e]['x'];
    				$new_object_position_y = $$objects[$e]['y'];
    				$new_object_position_z = $$objects[$e]['z'];
    				
    				$object_id_change= $$stars[$i]['star_id'];
    				$object_id_same= $$stars[$e]['star_id'];
    				
    				$change_position = "UPDATE positions SET x=$new_object_position_x , y=$new_object_position_y , z=$new_object_position_z WHERE star_id=$object_id_change";
    			
    				if($db->query($change_position))
    				{
    					log_star_position_change("$object_id_same","$object_id_change","$same_object_position_x = $old_object_position_x -> $new_object_position_x","$same_object_position_y = $old_object_position_y -> $new_object_position_y","$same_object_position_z = $old_object_position_z -> $new_object_position_z");
    					
    					// Close database connection
    			
    					$db->commit();
    				}
    				else
    				{
    					log_error_function("","131 , 133",mysqli_error($db),"System");
    				}
    				
    				break;
    				
    			}
    		}
    		
    		unset($$objects);
    	}
    

    Im Prinzip habe ich folgendes gemacht:

    1. Das Array nach x,y und z sortiert das ich immer nur das Nächste Element untersuchen muss.
    2. Das Array unterteilt, sodass der bereich in dem x liegt maximal 50 Einheiten groß ist.

    Das sollte schonmal maßgeblich der Performance zugute kommen.

    Jetzt bekomme ich aber in dieser Zeile:

    if($$objects[$e]['x'] == $$objects[$i]['x'] AND $$objects[$e]['y'] == $$objects[$i]['y'] AND $$objects[$e]['z'] == $$objects[$i]['z'])
    

    folgende Fehler:

    1. Warning: Illegal string offset 'x'
    2. Notice: Undefined variable: t in
    3. Notice: Undefined variable: s in
    4. Warning: Illegal string offset 'y' in .
      .
      .

    Das muss wohl irgendwas mit dem Variablen Arraynamen zutun haben aber ich komme nicht dahinter. vorallem versteh ich nicht wo das t und s herkommen.

    Danke für eure Hilfe!

    Gruß Jo

    1. Hallo j4nk3y,

      		$select = "Select id,x,y,z From position 
      				WHERE x > $a AND x < $b
      				ORDER BY x ASC , y ASC , z ASC";
      

      Ich würde in sql immer backtics verwenden, also

      Select `id`,`x`,`y`,`z` From `position`
      

      usf.

      if($$objects[$e]['x'] == $$objects[$i]['x'] AND $$objects[$e]['y'] == $$objects[$i]['y'] AND $$objects[$e]['z'] == $$objects[$i]['z'])
      

      vorallem versteh ich nicht wo das t und s herkommen.

      Möglicherweise ist objec _ t _ s irgendwie fehlerhaft.

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      1. Hallo j4nk3y,

        		$select = "Select id,x,y,z From position 
        				WHERE x > $a AND x < $b
        				ORDER BY x ASC , y ASC , z ASC";
        

        Ich würde in sql immer backtics verwenden, also

        Select `id`,`x`,`y`,`z` From `position`
        

        Ok, hat das irgendwelche auswirkungen?

        if($$objects[$e]['x'] == $$objects[$i]['x'] AND $$objects[$e]['y'] == $$objects[$i]['y'] AND $$objects[$e]['z'] == $$objects[$i]['z'])
        

        vorallem versteh ich nicht wo das t und s herkommen.

        Möglicherweise ist objec _ t _ s irgendwie fehlerhaft.

        Möglich aber wenn verstehe ich es nicht.

        Es ist auch sehr komisch, dass mein notepad++ manchmal das erste $ schwarz und Manchmal lila anzeigt, was dann wohl damit was zutun hat wie Notepad++ das $ interpretiert.
        Zum Beispiel ist hier:

        $$stars = array();
        
        $old_object_position_x = $$objects[$e]['x'];  
        .  
        .  
        .
        

        Ist das erste $ schwarz.

        Und hier:

        array_push($$stars , $star);
        
        for($i=0 ; $i<count($$stars) ; $i++)
        
        unset($$stars);
        

        Ist es lila.

        Und ganz verrückt:

        if($$stars[$e]['x'] == $$stars[$i]['x'] AND $$stars[$e]['y'] == $$stars[$i]['y'] AND $$stars[$e]['z'] == $$stars[$i]['z'])
        

        Hier ist in der ersten Variable das erste $ lila das zweite blau und in allen weiteren das erste schwarz und das zweite ebenfalls blau.

        Aber grundsätzlich dürfte die interpretation von n++, wie ein $ angezeigt wird ja nichts mit der interpretation vom Server, in meinem fall xampp zutun haben, oder?

        Zusätzlich ist mir gerade aufgefallen, dass das array nicht durch unset gelöscht wird. Also ist möglicher weise das lila $ in irgendeinem Sinn "falsch".

        Gruß
        Jo

        1. Hallo j4nk3y,

          Ich würde in sql immer backtics verwenden, also

          Select `id`,`x`,`y`,`z` From `position`
          

          Ok, hat das irgendwelche auswirkungen?

          In dem Moment, wo du (aus Unkenntnis) Bezeichner hast, die reservierte Wörter sind, auf jeden Fall. Und zwar imho ungeahnte.

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
        2. Hallo j4nk3y,

          Es ist auch sehr komisch, dass mein notepad++ manchmal das erste $ schwarz und Manchmal lila anzeigt, was dann wohl damit was zutun hat wie Notepad++ das $ interpretiert.

          Offensichtlich muss man mit variablen Variablen richtig aufpassen. Und wenn notepad++ durcheinanderkommt, dann vielleicht auch du?

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      2. Hallo Matthias,

        Ich würde in sql immer backtics verwenden, also

        Select `id`,`x`,`y`,`z` From `position`
        

        Ich nicht.

        • macht den Code schlechter lesbar und erhöht die Komplexität
        • macht das SQL weniger portabel (weil ist nicht Standard-gerecht escaped)
        • ist in den meisten Fällen überflüssig; in den Fällen, in denen es nicht überflüssig ist, sollte man lieber den Bezeichner ändern, denn das gibt erfahrungsgemäß sonst nur Probleme

        LG,
        CK

        1. Tach!

          Ich würde in sql immer backtics verwenden, also

          Ich nicht.

          • macht den Code schlechter lesbar und erhöht die Komplexität

          Letzteres ja, über ersteres kann man streiten. Es gibt so viele Dinge in Code, die quotiert werden müssen, da kommt es auf die paar auch nicht mehr an. Daran muss man sich als Programmierer gewöhnen. Leerzeichen und Zeilenumbrüche zur optischen Abgrenzung sind wichtiger.

          • macht das SQL weniger portabel (weil ist nicht Standard-gerecht escaped)

          YAGNI! Gern gebracht dieses Argument, aber wie oft kommt das denn im Leben vor, dass man das DBMS wechselt und dann noch dazu nur standardkonforme Dinge und keine auch anderswo reservierten Wörter verwendet hat? Das wird zum Beispiel schon bei Autoincrement-Feldern schwierig (gibts mindestens bei Oracle nicht). Das Argument suggeriert, dass man quasi einfach den Verbindungsaufbau ändert und fertig ist mit der Migration, ohne aufgrund der Unterschiede der DBMS sowieso sämtliche Stellen mit Datenbankzugriff überprüfen und neu testen zu müssen. Ein schöner Wunschtraum.

          Andererseits kann man mit dem Umstellen einer Option (auch zur Laufzeit) auch MySQL dazu bringen, standardkonforme Quotierzeichen an Bezeichnern zu akzeptieren.

          Wenn man dieses Argument als Pro für Standardgerechtes Quotieren (Escapen ist das Maskieren innerhalb von String-Literalen) interpretiert, widerspricht das aber deinen beiden anderen Argumenten.

          • ist in den meisten Fällen überflüssig; in den Fällen, in denen es nicht überflüssig ist, sollte man lieber den Bezeichner ändern, denn das gibt erfahrungsgemäß sonst nur Probleme

          Da fallen mir grad keine ein, wenn man konsequent die Bezeichner quotiert. Andererseits muss man alle reservierten Wörter aller SQL-Dialekte kennen, um nicht in die Keyword-Falle spätestens beim Migrieren (YAGNI) zu tappen. Hatten wir ja erst neulich hier, dass jemand das Problem an einem Bezeichner namens int1 nicht erkannt hat (abgesehen davon, dass das nicht gerade ein sprechender Bezeichner ist). Es ist auch manchmal schwierig andere Bezeichner zu finden. Was würdest du beispielsweise als Ersatz für das reservierte Wort language verwenden, wenn man die Sprache meint, in der ein Text verfasst ist oder die ein Besucher spricht? Abkürzungen sind immer so eine Sache und Verlängerungen erhöhen die Komplexität bei nicht unbedingt steigender Verständlichkeit.

          dedlfix.

          1. Hallo dedlfix,

            • macht den Code schlechter lesbar und erhöht die Komplexität

            Letzteres ja, über ersteres kann man streiten.

            Das denke ich nicht. Es gibt schon einen common sense in der Entwickler-Gemeinde.

            Es gibt so viele Dinge in Code, die quotiert werden müssen, [...]

            Eben, und jedes weitere notwendige quoten mach den Code schlechter lesbar. Bei einer Tabelle mit fünf Feldern mag das noch irrelevant sein, aber wenn wir jetzt 15 oder 20 Felder haben, ist die Feld-Liste deutlich schlechter lesbar.

            Daran muss man sich als Programmierer gewöhnen.

            Das halte ich für die falsche Einstellung und für ein schlechtes Argument. Damit werden die Dinge nie besser.

            • macht das SQL weniger portabel (weil ist nicht Standard-gerecht escaped)

            YAGNI! Gern gebracht dieses Argument, aber wie oft kommt das denn im Leben vor, dass man das DBMS wechselt [...]

            Öfter als man denkt. Ich habe allein schon selbst geschriebene Software bereits drei mal portiert, von MySQL auf PostgreSQL. Von Patches für FLOSS will ich gar nicht erst reden.

            und dann noch dazu nur standardkonforme Dinge und keine auch anderswo reservierten Wörter verwendet hat?

            Natürlich wird man immer Dinge anpassen müssen, aber der Aufwand steigt ins unermessliche wenn jede beschissene Feld-Liste angepasst werden muss.

            Das Argument suggeriert, dass man quasi einfach den Verbindungsaufbau ändert und fertig ist mit der Migration [...]

            Wenn du das denkst, dann hast du mich nicht verstanden :)

            Wenn man dieses Argument als Pro für Standardgerechtes Quotieren (Escapen ist das Maskieren innerhalb von String-Literalen) interpretiert, widerspricht das aber deinen beiden anderen Argumenten.

            Wenn man quoten muss, dann lieber standard-konform. Wenn man nicht quoten muss, dann bitte nicht tun. Das war die Botschaft.

            • ist in den meisten Fällen überflüssig; in den Fällen, in denen es nicht überflüssig ist, sollte man lieber den Bezeichner ändern, denn das gibt erfahrungsgemäß sonst nur Probleme

            Da fallen mir grad keine ein, wenn man konsequent die Bezeichner quotiert.

            Du bist meistens nicht der einzige, der mit der Datenbank arbeitet. Du ersparst deinen Kollegen oder Nachfolgern eine Menge Kopfschmerzen, wenn du reservierte Wörter, Leerzeichen und ähnliche Nickeligkeiten einfach nicht verwendest. Der common sense ist nunmal, dass man nicht überall quoted, damit sollte man rechnen und mit einbeziehen.

            Andererseits muss man alle reservierten Wörter aller SQL-Dialekte kennen, um nicht in die Keyword-Falle spätestens beim Migrieren (YAGNI) zu tappen.

            Das Subset an Keywords ist in den DBMSen recht ähnlich, die Wahrscheinlichkeit ist also gering. Ich muss also nicht wissen, dass ich int1, int2, int4 nicht verwende, sondern dass ich int* nicht verwende (nicht auf die Goldwage legen, du weisst sicher, was ich meine). Ansonsten sind Überraschungen natürlich immer möglich, klar, aber auch hier gilt wieder: der Aufwand steigt, je mehr man seinen eigenen Kopf durchsetzt und sich nicht an common sense hält.

            Was würdest du beispielsweise als Ersatz für das reservierte Wort language verwenden, wenn man die Sprache meint, in der ein Text verfasst ist oder die ein Besucher spricht?

            Ich würde entweder abkürzen (lang) oder spezifischer werden (user_language, text_language). Das hängt davon ab, ob sich die Sprache auf den ganze Datensatz bezieht oder nur auf ein einzelnes Datum.

            Ich habe schon oft in anderen Datenbanken arbeiten müssen, für Kundenprojekte bei denen wir direkt auf die DB zugegriffen haben, bei FLOSS-Projekten, usw, pp. Haben sich die Leute nicht an den common sense bei Bezeichnern gehalten (bei einem Kunden waren z.B. Leerzeichen besonders beliebt), dann hat das immer zu mehr Komplexität und mehr Aufwand geführt. Ich würde davon immer abraten.

            LG,
            CK

    2. Tach!

      Das muss wohl irgendwas mit dem Variablen Arraynamen zutun haben aber ich komme nicht dahinter. vorallem versteh ich nicht wo das t und s herkommen.

      Die übliche Vorgehensweise, wenn Wunsch und Wirklichkeit offensichtlich nicht übereinstimmen, ist erstmal zu schauen, was da wirklich los ist. Also was steht in deinen Variablen drin? var_dump() zeigt es an.

      Und dann ist da noch die Frage, was du da mit den variablen Variablen machst und warum du da kein Array nimmst.

      dedlfix.

    3. Hallo,

      Das muss wohl irgendwas mit dem Variablen Arraynamen zutun haben aber ich komme nicht dahinter.

      meine Erfahrungen mit variablen Variablennamen sind schon länger her. Aber ich meine mich zu erinnern, dass sie erstens den Code nach drei Wochen unlesbar machten. Und zweitens nicht mit Arrays funktionierten.

      Gruß
      Kalk

      1. Moin,

        Das muss wohl irgendwas mit dem Variablen Arraynamen zutun haben aber ich komme nicht dahinter.

        meine Erfahrungen mit variablen Variablennamen sind schon länger her. Aber ich meine mich zu erinnern, dass sie erstens den Code nach drei Wochen unlesbar machten. Und zweitens nicht mit Arrays funktionierten.

        Das kann möglicherweise der Grund sein, ich werd gleich mal schaun ob ich das auch ohne hinkriege. da ich ja das Array am Ende lösche, bräuchte ich die Variabilität wohl auch garnicht.

        Das werd ich gleich mal ausprobieren, danke für den Tipp, ich werd mich da auch nochmal schlau googlen.

        Gruß
        Jo

      2. Hallo,

        meine Erfahrungen mit variablen Variablennamen sind schon länger her. Aber ich meine mich zu erinnern, dass sie erstens den Code nach drei Wochen unlesbar machten. Und zweitens nicht mit Arrays funktionierten.

        Hier gibt's 'ne Lösung für zweitens, aber nicht für erstens.

        Gruß
        Kalk

      3. Hallo Tabellenkalk,

        meine Erfahrungen mit variablen Variablennamen sind schon länger her. Aber ich meine mich zu erinnern, dass sie […] nicht mit Arrays funktionierten.

        php-Manual:

        Wenn Sie variable Variablen mit Arrays verwenden, müssen Sie eine Doppeldeutigkeit beachten. Wenn Sie nämlich $$a[1] schreiben, dann muss der Parser wissen, ob Sie $a[1] als Variable oder $$a als Variable und dann [1] als Index dieser Variablen verwenden wollen bzw. gemeint haben. Die Syntax zur Lösung dieser Doppeldeutigkeit: Verwenden Sie im ersten Fall ${$a[1]} und im zweiten Fall ${$a}[1].

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
        1. Hallo Tabellenkalk,

          meine Erfahrungen mit variablen Variablennamen sind schon länger her. Aber ich meine mich zu erinnern, dass sie […] nicht mit Arrays funktionierten.

          php-Manual:

          Wenn Sie variable Variablen mit Arrays verwenden, müssen Sie eine Doppeldeutigkeit beachten. Wenn Sie nämlich $$a[1] schreiben, dann muss der Parser wissen, ob Sie $a[1] als Variable oder $$a als Variable und dann [1] als Index dieser Variablen verwenden wollen bzw. gemeint haben. Die Syntax zur Lösung dieser Doppeldeutigkeit: Verwenden Sie im ersten Fall ${$a[1]} und im zweiten Fall ${$a}[1].

          Klasse, das hab ich bisher noch nicht gefunden, habs dann schlussendlich auch umgangen, Trotzdem vielen Dank!

          Gruß
          Jo

          1. Hallo,

            Klasse, das hab ich bisher noch nicht gefunden

            Obwohl ich dir exakt das gleiche wie Mathias schon fast 2 h früher verlinkt hatte? Merkwürdig, hab ich wohl was flasch gemacht.

            Gruß
            Kalk

            1. Hallo,

              Klasse, das hab ich bisher noch nicht gefunden

              Obwohl ich dir exakt das gleiche wie Mathias schon fast 2 h früher verlinkt hatte? Merkwürdig, hab ich wohl was flasch gemacht.

              Das kannt ich auch schon vorher, nur hab ich den Absatz nicht gefunden/gelesen, weil ich mir normalerweise größtenteils nur die Beispiele ansehe und dann entweder finde was ich suche oder mich weiter umschaue.

              Gruß
              Jo