Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Variable Anzahl Parameter bie build-in-functions

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Variable Anzahl Parameter bie build-in-functions

    Hallo,

    ich möchte eine Funktion schreiben, der man als ersten Parameter einen array(aus datenbank zeilen, also Arrays) und beliebig viele Sortflags übergeben kann.

    Dieser Array soll dann in einezelne Spalten-Arrays umgewandelt und mittels array_multisort sortiert werden. Soweit die Thorie.

    Es harkt auch nur an einer Stelle, die Anzal der Parameter, die ich der Funktion array_multisort übergeben möchte ist mir unbekannt, da variabel.

    Gibt es in PHP eine möglichkeit so etwas zu bauen?

    also ich bin auf der Suche nach einer Möglichkeit

    $ary = array(array(),array(), ... );

    array_multisort(func_name($ary));

    aufzurufen, wobei ich mir func_name so vorstelle:

    function func_name($ary)
    {
    // verabeitung
    // return eines Wertes (Zeichenkette), so dass array_mutlisort funktioniert
    }

    Im einfachsten Fall sollen also semtlichen Arrays aus $ary der Funktion array_multisort übergeben werden. Wenn das klappt, bekomme ich das mit den Sort Flags auch noch hin

    Vielen Dank für Eure Hilfe im Voraus


  • #2
    PHP-Code:
    function foo()
    {
        echo 
    'foo() wurde mit ' func_num_args() . " Parametern aufgerufen<br />\n";
        
    $args func_get_args();
        echo 
    'Parameter: ' join(','$args)  . "<br />\n";
    }

    foo(1,2,3,4,5);
    foo('a','b','c'); 
    Darüber hinaus soltlest Du Dir array_shift() und call_user_func_array() ansehen.

    Kommentar


    • #3
      Hallo,
      vielen dank, für den hinweis mit den variablen Parametern, aber wie kann ich diese, an eine built in function weitergeben?

      Wie gesagt geht es hier konkret um die array_multisort function (die ja mit einer variablen Anzahl Parameter aufgerufen werden kann).

      um das zu verdeutlichen
      PHP-Code:
      function foo()
      {
          echo 
      'foo() wurde mit ' func_num_args() . " Array aufgerufen<br />\n";
          
      $args func_get_args();
          
      //und hier EIN array_multisort aufruf mit ALLEN arrays als Parametern
      }

      foo($array1$array2etc.) 
      Hoffe das ist ein bisschen klarer geworden, vielen Dank noch mal ...

      Kommentar


      • #4
        Zitat von David
        Darüber hinaus soltlest Du Dir array_shift() und call_user_func_array() ansehen.
        Im Handbuch, PHP: - Manual

        Kommentar


        • #5
          Vielen Dank für die Hilfe und entschuldigung für die blöde Nachfrage!

          Ich hatte: call_user_func_array() nicht richtig verstanden ...

          Viele Grüße
          ...

          Kommentar


          • #6
            Der Tipp war zwar hilfreich doch liefert er nicht das gewünschte Ergebnis:

            Hier mal mein Code:

            PHP-Code:
            <? 
                $ary = array();
                $ary[0] = array("id" => 3,
                                                "name" => "Hans",
                                                "testing" => "asdf",
                                                "zahl" => 5);
                $ary[1] = array("id" => 2,
                                                "name" => "Fritz",
                                                "testing" => "fdsa",
                                                "zahl" => 10);
              $ary[2] = array("id" => 1,
                                                "name" => "Anette",
                                                "testing" => "hjkl",
                                                "zahl" => 15);
                my_sort($ary);
                
                function my_sort($ary) 
                {
                    foreach ($ary as $key => $row) 
                    {
                    $i = 0;
                    foreach($row as $entry)
                    {
                        $temp[$i][$key] = $entry;
                        $keys[$key] = $key;
                        $i++;        
                    }
                }
                    $temp[$i] = $ary;
                    $temp2 = $temp;
                    
                    call_user_func_array('array_multisort',$temp2);
                    array_multisort($temp[0],$temp[1], $temp[2], $temp[3]);    
                    
                    if($temp == $temp2)
                    {
                        echo "gleich";
                    }
                    var_dump($temp);
                    var_dump($temp2);
                }
                
            ?>
            Hier die Ausgaben für die var_dumps, eigentlich sollte man das gleiche erwarten, doch nur $temp liefert was ich möchte. Was ist an der Funktion falsch?

            PHP-Code:
            array(5) {
              [
            0]=>
              array(
            3) {
                [
            0]=>
                
            int(3)
                [
            1]=>
                
            int(2)
                [
            2]=>
                
            int(1)
              }
              [
            1]=>
              array(
            3) {
                [
            0]=>
                
            string(4"Hans"
                
            [1]=>
                
            string(5"Fritz"
                
            [2]=>
                
            string(6"Anette"
              
            }
              [
            2]=>
              array(
            3) {
                [
            0]=>
                
            string(4"asdf"
                
            [1]=>
                
            string(4"fdsa"
                
            [2]=>
                
            string(4"hjkl"
              
            }
              [
            3]=>
              array(
            3) {
                [
            0]=>
                
            int(5)
                [
            1]=>
                
            int(10)
                [
            2]=>
                
            int(15)
              }
              [
            4]=>
              array(
            3) {
                [
            0]=>
                array(
            4) {
                  [
            "id"]=>
                  
            int(3)
                  [
            "name"]=>
                  
            string(4"Hans"
                  
            ["testing"]=>
                  
            string(4"asdf"
                  
            ["zahl"]=>
                  
            int(5)
                }
                [
            1]=>
                array(
            4) {
                  [
            "id"]=>
                  
            int(2)
                  [
            "name"]=>
                  
            string(5"Fritz"
                  
            ["testing"]=>
                  
            string(4"fdsa"
                  
            ["zahl"]=>
                  
            int(10)
                }
                [
            2]=>
                array(
            4) {
                  [
            "id"]=>
                  
            int(1)
                  [
            "name"]=>
                  
            string(6"Anette"
                  
            ["testing"]=>
                  
            string(4"hjkl"
                  
            ["zahl"]=>
                  
            int(15)
                }
              }
            }
            array(
            5) {
              [
            0]=>
              array(
            3) {
                [
            0]=>
                
            int(1)
                [
            1]=>
                
            int(2)
                [
            2]=>
                
            int(3)
              }
              [
            1]=>
              array(
            3) {
                [
            0]=>
                
            string(6"Anette"
                
            [1]=>
                
            string(5"Fritz"
                
            [2]=>
                
            string(4"Hans"
              
            }
              [
            2]=>
              array(
            3) {
                [
            0]=>
                
            string(4"hjkl"
                
            [1]=>
                
            string(4"fdsa"
                
            [2]=>
                
            string(4"asdf"
              
            }
              [
            3]=>
              array(
            3) {
                [
            0]=>
                
            int(15)
                [
            1]=>
                
            int(10)
                [
            2]=>
                
            int(5)
              }
              [
            4]=>
              array(
            3) {
                [
            0]=>
                array(
            4) {
                  [
            "id"]=>
                  
            int(1)
                  [
            "name"]=>
                  
            string(6"Anette"
                  
            ["testing"]=>
                  
            string(4"hjkl"
                  
            ["zahl"]=>
                  
            int(15)
                }
                [
            1]=>
                array(
            4) {
                  [
            "id"]=>
                  
            int(2)
                  [
            "name"]=>
                  
            string(5"Fritz"
                  
            ["testing"]=>
                  
            string(4"fdsa"
                  
            ["zahl"]=>
                  
            int(10)
                }
                [
            2]=>
                array(
            4) {
                  [
            "id"]=>
                  
            int(3)
                  [
            "name"]=>
                  
            string(4"Hans"
                  
            ["testing"]=>
                  
            string(4"asdf"
                  
            ["zahl"]=>
                  
            int(5)
                }
              }

            Vielen Dank schon mal Grüße sqrt

            Kommentar


            • #7
              Oh Kopfchaos. Was soll die Funktion denn erzeugen?
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Sieht mir irgendwie nach dem Versuch aus, eine Pivottabelle zu erstellen. Aber sicher bin ich mir auch nicht.

                Kommentar


                • #9
                  Ziel

                  Ziel ist es ein Skript al à PHP: Manual Quick Reference Example #3 zu schreiben, dass DB Einträge nachträglich sortiert (Ich weiß, man könnte es sicher in manchen Fällen auch auf der DB sortieren, dass ist hier aber nicht die Idee)

                  Nur soll mein Skript im Gegensatz zu dem auf php.net eine Varibele Anzahl von Fledern pro Datensatz entgegen nehmen könne.

                  Vielen Dank
                  sqrt

                  Kommentar


                  • #10
                    Dann ist vielleicht usort() besser geeignet.

                    Kommentar


                    • #11
                      Wie könnte das Eurer Meinung nach aussehen, damit kann ich mir im momment keinen Code Vorstellen oder bedeutet das, dass ich eine eigen sortierfunktion schrieben muss?

                      Kommentar


                      • #12
                        Sortiere die Daten direkt in der Datenbank (also via SQL). array_sort() & co ist grotten-lahm.

                        Kommentar


                        • #13
                          Zitat von sqrt Beitrag anzeigen
                          Wie könnte das Eurer Meinung nach aussehen, damit kann ich mir im momment keinen Code Vorstellen
                          Brauchst Du auch nicht, auf der Seite im Online Handbuch gibt es Beispiele, PHP: usort - Manual
                          Zitat von sqrt Beitrag anzeigen
                          oder bedeutet das, dass ich eine eigen sortierfunktion schrieben muss?
                          Nur eine Vergleichsfunktion, die zwei Elemente anordnet (ist Element a kleiner/gleich/größer Element b).

                          Kommentar


                          • #14
                            Danke für den Tipp mit usort, habe eben noch mal im Manual nach gelesen, dass es wohl ein Referenzen Prolem ist hier also meine Lösung:

                            PHP-Code:
                                function my_sort($aryflags false
                                {
                                    foreach (
                            $ary as $key => $row
                                    {
                                    
                            $i 0;
                                    foreach(
                            $row as $entry)
                                    {
                                        
                            $temp[$i][$key] = $entry;
                                        
                            $keys[$key] = $key;
                                        
                            $i++;        
                                    }
                                }
                                    
                            $temp[$i] = & $ary;
                                    
                                    
                            call_user_func_array('array_multisort',$temp);
                                        
                                    return(
                            $temp[(count($temp)-1)]);
                                } 
                            man beachte das & vor $ary ...

                            Danke auch für den Hinweis mit dem sortieren auf der DB, aber das kommt in diesem speziellen Fall leider nicht in Frage.

                            Vielen Dank an alle freundlichen Helfer ...

                            Kommentar


                            • #15
                              Hallo,
                              was mir aufgefallen ist, ist dass man die Funktion anschaut und keine Ahnung hat was sie eigentlich macht. Sie sortiert wohl irgendwie irgendwas.

                              man beachte das & vor $ary ...
                              Ich empfehle dir genau solche Kommentare auch im Quellcode zu hinterlassen.


                              Danke auch für den Hinweis mit dem sortieren auf der DB, aber das kommt in diesem speziellen Fall leider nicht in Frage.
                              Warum eigentlich? Du wuerdest die Komplexitaet auf String-Manipulation runterbrechen, denn ein SQL-Statement ist ja erstmal nur ein String in PHP und schoene Sache: MySQL unterstuetzt Mehrfachsortierung.

                              Aber ich zwinge niemanden mehr zu seinem Glueck Kannst du als OT eigentlich den Thread als erledigt markieren, oder koennen das nur die Moderatoren?
                              "Mein Name ist Lohse, ich kaufe hier ein."

                              Kommentar

                              Lädt...
                              X