array mit mehreren werten

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

  • array mit mehreren werten

    Hi

    Ich habe ein kleines Problem wo ich grad nicht weiter weiss, und hoffe jemand von euch kann mir da weiterhelfen.

    Bisher hatte ich folgenden arrayaufbau:
    Array
    (
    [0] => 9
    [1] => 2
    [2] => 8
    [3] => 11
    )

    Nun habe ich eine MySQL Abfrage gemacht mit
    WHERE PersonalID IN (".implode(",", $meinarray).")
    Dies klappte alles wunderbar wie es soll.

    Nun würde ich zu den einzelnen PersonalID ab und an gerne auch Optionen mit einfügen. Ich habe mir dann überlegt, ich könnte so ein array machen:
    Array
    (
    [0] => 9
    [1] => 9-2
    [2] => 9-1
    [3] => 2
    [4] => 2-1
    [5] => 8
    [6] => 11-7
    [7] => 11-9
    )

    Die erste Zahl ist die PesonalID und die zweite eine entsprechende Option. Wenn es keine gibt, soll er obengenannte Abfrage machen.

    Wenn es jedoch eine zweite gibt, soll er quasi im array erstmal die Inhalte löschen wo die PersonalID einzel steht. In diesem beispiel wäre das dann der Index 0 und der index 2

    Jetzt würde ich aber gerne eine WHILE erstellen, wo er einerseits das selbe wie oben abfragen würde, jedoch zusätzlich noch AND AID IN (Die werde der Optionen die zur PersonalID gehören).

    Geht sowas überhaupt, oder ist das ganze zu komplex?

    Danke schonmal für eure Hilfeversuche und Tipps.

    Gruss

    Olli

  • #2
    Und wieso kein mehrdimensionales Array:
    PHP-Code:
    array(
        
    => array('a''b'),
        
    => array('b''c'),
        
    => 'e'.
    ); 
    ?

    Grüße
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      Original geschrieben von Griecherus
      [B]Und wieso kein mehrdimensionales Array:
      Hi

      Danke für deine Antwort.

      Das habe ich mir auch schon überlegt, dass ich mir statt 1-2 direkt einen Mehrdimensioalen array erstelle.

      Dies ist soweit auch gar kein Problem. Jedoch hapert es dann an der weiteren Ausführung wie ich am einfachsten die Werte wo nur eine PersonalID vorhanden ist lösche sofern die AID leer ist, und vorallem ist mein grösstes Problem wie ich die MySQL Abfrage am bessten gestalte.

      Gruss

      Olli

      Kommentar


      • #4
        Original geschrieben von Olli4
        Dies ist soweit auch gar kein Problem. Jedoch hapert es dann an der weiteren Ausführung wie ich am einfachsten die Werte wo nur eine PersonalID vorhanden ist lösche sofern die AID leer ist
        An dieser Stelle sehe ich absolut kein Problem.

        Ein mehrdimensionales Array sehe wie folgt aus:
        $array[1][ID], $array[1][wert1], $array[1][wert2]....

        Unter Verwendung einer einfachen IF-Abfrage ließe sich nun prüfen, ob das Feld neben der ID noch weitere Werte beheimatet.

        ..., und vorallem ist mein grösstes Problem wie ich die MySQL Abfrage am bessten gestalte.
        Hier sehe ich nur Vorteile des mehrdimensionalen Arrays, da du ohne zusätzliche Trennfunktion Zugriff auf die jeweiligen Werte hast.
        [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
        [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

        Kommentar


        • #5
          Hi

          Danke für deine Antwort.

          Ein mehrdinemsionaler Array könnte ja ungefähr so aussehen:

          $array[0] (
          [PersonalId] => 9
          [AIF] =>
          )
          $array[1] (
          [PersonalId] => 9
          [AIF] => 2
          )
          $array[3] (
          [PersonalId] => 9
          [AIF] => 1
          )
          etc.
          Da ist dann die Frage ob sich das lohnt den Array einmalig umzuschreiben das dieser so aufgebaut ist, oder ob ich nachher einfach mit implode arbeite.

          Unter Verwendung einer einfachen IF-Abfrage ließe sich nun prüfen, ob das Feld neben der ID noch weitere Werte beheimatet.
          So könnte ich den Arrayinhalt mit unset löschen ja. Aber wie würde ich dies anstellen, wenn er noch erst Prüfen soll ob ein weiterer Array mit der PersonalID vorhanden ist wo AIF ebenfals ein wert hat.
          Bei meinem ersten arraybeispiel sollte er nur den index 0 und 2 löschen. Beim Index 8 hat es ja keine weiteren Arrayinhalte wo die PersonalID 8 wäre und eine AID vorhanden wären

          Zum MySQL: Wie würde dies denn aussehen? Ich glaube ich stehe hier etwas auf dem Schlauch. Er soll mir ja die AID noch beachten. Also wenn wir dies ansehen:
          [0] => 9
          [1] => 9-2
          [2] => 9-1
          Sollte es ungefähr so sein:
          WHERE PersonalID = '9' AND (AID = '2' OR AID = '1')
          einfach mit einer Abfrage. Also das ich ihm sagen könnte alle Einträge wo die PersonalID im Array ist, und entsprechend zur PersonalID die AID beachten soll und wenn keine AID im Array ist wie im Anfangsbeispiel beim Index 8 soll er die AID nicht beachten.

          Gruss

          Olli

          Kommentar


          • #6
            Original geschrieben von Olli4
            So könnte ich den Arrayinhalt mit unset löschen ja. Aber wie würde ich dies anstellen, wenn er noch erst Prüfen soll ob ein weiterer Array mit der PersonalID vorhanden ist wo AIF ebenfals ein wert hat.
            Dies lässt sich pauschal nicht sagen. Es gibt verschiedene Methoden, Arrays zu durchsuchen. Wenn die Datenmenge überschaubar ist, wäre es sinnvoll, das Array entsprechend nach der ID zu sortieren, da du dann lediglich die benachbarten Felder absuchen müsstest.

            Oder du nutzt direkt die ID als eindeutige Referenz.
            Also: $array[$ID]
            {
            [0] => 2
            [1] => 1
            ...
            }

            Mittels count() kannst du dann auch direkt in Erfahrung bringen, wieviel Werte unter der entsprechenden ID hinterlegt sind.

            Zum MySQL: Wie würde dies denn aussehen? Ich glaube ich stehe hier etwas auf dem Schlauch. Er soll mir ja die AID noch beachten. Also wenn wir dies ansehen:
            [0] => 9
            [1] => 9-2
            [2] => 9-1
            Sollte es ungefähr so sein:
            WHERE PersonalID = '9' AND (AID = '2' OR AID = '1')
            einfach mit einer Abfrage. Also das ich ihm sagen könnte alle Einträge wo die PersonalID im Array ist, und entsprechend zur PersonalID die AID beachten soll und wenn keine AID im Array ist wie im Anfangsbeispiel beim Index 8 soll er die AID nicht beachten.
            Nutzt du, wie zuvor angesprochen, die ID als eindeutige Referenz, kannst du ohne aufwendiges Suchen die Anzahl der zugehörigen Werte ermitteln und eine entsprechende Abfrage per Schleife zusammenstellen.

            Was mir noch auffällt:
            Ich weiß nicht, woher die Daten stammen, aber ggf. wäre es sinnvoll, Leerwerte beim Einlesevorgang nicht zu berücksichtigen?
            [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
            [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

            Kommentar


            • #7
              Hi

              Danke dir. Da sieht man doch ab und an den Wald vor lauter Bäumen nicht.
              Ich habe mir nun folgenden Array gebaut:
              PersonalID = 9:
              $array[9][0] = 9;
              $array[9][1] = 2;
              $array[9][2] = 1;
              PersonalID = 8:
              $array[8][0] = 8;

              Nun habe ich einen sauberen Array wo ich das habe was ich wollte.

              Zum MySQL: Kannst du mir hier nochmals helfen? Ich finde einfach keine Lösung dazu wie diese aussehen muss. Ich möchte ja wenn möglich grad eine SELECT Abfrage haben wo ich dann in der while habe, ohne das ich in der while noch zusätzlich die Optionen (AID) abrufen muss ob welche da sind und wenn ja diese noch filtern.

              Zu deiner Frage: Der Array wird über ein Formular gefüllt. Habe nach dem Arrayeinlesen nun obengenannen array erzeugt.

              Danke nochmals für deine Hilfe.

              Gruss

              Olli

              Kommentar


              • #8
                Etwas notdürftig zusammengeschustert, aber so sollte es grob funktionieren:

                PHP-Code:
                $ID 9;

                $array[$ID][0] = 9;
                $array[$ID][1] = 2;
                $array[$ID][2] = 1;


                $str "WHERE PersonalID = '"$ID "' AND (";
                $count count($array[$ID]);
                $i 0;

                foreach(
                $array[$ID] as $value)
                {
                  
                $str .= "AID = '"$value "'";
                  
                $i++;
                  
                  if(
                $i $count$str .= " OR ";
                  else 
                $str .= ")";

                }

                echo 
                $str
                Da die Daten aus Formulareingaben stammen, wäre es sinnvoll, die Daten während der Ausführung des SQL-Befehl zu maskieren zwecks Vermeidung von SQL-Injections.
                [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
                [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

                Kommentar


                • #9
                  Hi

                  Danke für deine Antwort.
                  Wegen den SQL Injections. Die Werte sind per Intval maskiert worden. Entsprechend kann ja kein Text eingeschleust werden.

                  Ist das die einzige lösung? Dann müsste ich ja pro ID (so habe ich es bereits) eine SQL Abfrage starten.

                  Kann man das nicht irgendwie in einer machen? Wenn es nur um die PersonalID gehen würde geht ja dies: WHERE PersonalID IN (".implode(",", $meinarray)."). Meine Frage war ja ursprünglich ob dies irgendwie in einer Abfrage gehen würde mit den Optionen.

                  Wenn nicht lasse ich es so wie es ist. Aber wen es so wäre, würde es etwas einfacher gehen.

                  Gruss

                  Olli

                  Kommentar


                  • #10
                    Also du möchtest eine SQL-Abfrage, die für sämtliche IDs mitsamt der zugehörigen Werte die entsprechenden Daten abfragt?
                    [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
                    [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

                    Kommentar


                    • #11
                      Genau ja.

                      Also ich hatte ja dies nur für die PersonalID:
                      WHERE PersonalID IN (".implode(",", $meinarray).")
                      Sagen wir meinarray hatte 2 3 und 5
                      Also das wir quasi dann dies haben wenn bei 5 noch optionen 2 und 6 drin sind hätten wir drei abfragen:
                      WHERE PersonalID = '2'
                      WHERE PersonalID = '3'
                      WHERE PersonalID = '5' AND (AID = '2' OR AID = '6')

                      Wenn ich dir das so schreibe, habe ich ggf grad eine Lösung gesehen ähnlich wie deine. Könnte ich so den array einfach durchlaufen und ein $whilestring generieren der so aussieht:
                      $while = "(PersonalID = '2') OR (PersonalID = '3') OR (PersonalID = '5' AND (AID = '2' OR AID = '6'))"
                      oder wäre dies nicht schlau wenn es nicht sogar eine bessere lösung geben würde?

                      Gruss

                      Olli

                      Kommentar


                      • #12
                        Ich will nicht sagen, dass es sich hierbei um die beste Lösung handelt, wenngleich mir keine bessere spontan in den Sinn kommt, aber sie erscheint mir gerade aufgrund der Einfachheit am sinnvollsten.
                        [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
                        [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

                        Kommentar


                        • #13
                          Danke dir für deine Aktive Hilfe.

                          Gruss

                          Olli

                          Kommentar

                          Lädt...
                          X