Ankündigung

Einklappen
Keine Ankündigung bisher.

Links sortieren und gruppieren

Einklappen

Neue Werbung 2019

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

  • Links sortieren und gruppieren

    Ich habe 2arrays. Einmal den Link und einmal den Namen des Link.
    Die möchte ich nach a bis z Sortieren.
    Dann sollen die auch in Gruppen nach den Anfangsbuchstaben Sortiert werden Gruppe ,a,b,c,d usw

    Nur irgendwie komme ich jetzt nicht mehr weiter weil habe mich jetzt ganz verblödet.
    Wenn dann klappt das sortieren von a-z und die Links sind falsch.und passen nicht zu den Linknamen
    Oder es ist unsortiert aber die Links passen zu den Namen.
    Zu den Gruppieren bin ich noch gar nicht gekommen weil der Wurm jetzt noch da ist .
    Wahrscheinlich gehe ich das auch vollkommen falsch an.

    Noch ein Hinweiß . Die arrays sind nach der Reihe geschrieben. Ich meine damit das der erst Link der erste Name ist ,der 2 Link der 2 Name usw
    zb
    <a href="'.$linksd[1].'">'.$words[1].'</a>
    <a href="'.$linksd[2].'">'.$words[2].'</a>
    usw

    Mein jetziger Code der wahrscheinlich der Falsche Weg ist und wohl ehr mumpitz ist.
    PHP-Code:
    <?php
    $words
    explode(','$allnames);//name des Link
    $linksd=explode(','$alllinks);  //link davon
    $f=0;

    usort($words'strnatcasecmpspec');
    $prevL '';  
    foreach(
    $words as $str){
    $f++;
      if(
    $prevL !== initialLetter($str))  
          echo 
    '<b>'.initialLetter($str).'</b><br />';
          echo 
    '<a href="'.$linksd[$f].'">'.$str.'</a><br />';  
          
    $prevL initialLetter($str);
    }


    function 
    strnatcasecmpspec($a$b){
          return 
    strnatcasecmp($a$b);
    }

    function 
    initialLetter($tmpStr){
         
    $first substr($tmpStr01);
         
    $first strtoupper($first);
         return 
    preg_match('/[A-Z]/'$first) ? $first '#';
    }

    ?>

    Könnt ihr mir helfen den richtigen Weg zu finden ,bzw was ich ändern muß ?
    Ich mach keine Rechtschreibfehler - ich schreib Freestyle!
    Erreichbar in mein Javascript-Forum und in Facebook-Chat

  • #2
    Wieso 2 Array's???
    PHP-Code:
    $links = array("Name1" => "Link1",
                   
    "Name2" => "Link2",
                   
    "Name3" => "Link3",
                   
    "Name4" => "Link4",
                   
    "Name5" => "Link5");

    foreach (
    $links as $name => $link)
      echo 
    "<a href='$link'>$name</a><br>\n"
    Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

    Kommentar


    • #3
      Weil die Arrays da so ankommen wollte ich es natürlich so auch versuchen umzusetzen. Aber das kann ich in meinen Fall aber ändern .ich werde das Mal mit deiner Variante versuchen mit den mehrfachen Array ( mir fällt gerade der Name nicht ein ). Ich hoffe dass ich es hinbekomme. Wenn das geklappt hat und alle Links von a bis z ausgegeben werden , wie bekommt man das mit den Gruppen hin ? Habt ihr da einen tipp oder Link für mich ?
      Ich mach keine Rechtschreibfehler - ich schreib Freestyle!
      Erreichbar in mein Javascript-Forum und in Facebook-Chat

      Kommentar


      • #4
        Zum Thema Gruppieren steht was hier:
        https://php-de.github.io/jumpto/gruppenbruch/

        Kommentar


        • #5
          Mit 2 Arrays zu arbeiten macht es nur kompiziert. Mache ein mehrdimensionales daraus, dann werden Sortierung und Gruppierung einfacher.

          PHP-Code:
          $data = [
            [
              
          "link" => "alink",
              
          "word" => "aword"
            
          ]
            
          // :
          ]; 
          Ein Array von diesen Format kannst du dann z.B. mit array_multisort() nach link, word oder beides sortieren.

          Kommentar


          • #6
            Multisort braucht er hier nocht nicht ein mal.

            PHP-Code:
            <?php
            header
            ('Content-Type: text/html; charset=utf-8');

            $a = array("ab""bd""ac""ba""bh");
            $b = array("https://example.com/eins""https://example.com/zwei""https://example.com/drei""https://example.com/vier""https://example.com/fuenf");

            foreach ( 
            $a as $key=>$value ){
                
            $new_array[$value] = $b[$key];  
            }

            ksort($new_array);

            echo 
            "<pre>";
            print_r($new_array);
            echo 
            "</pre>";
            ?>
            erzeugt folgende Ausgabe
            Code:
            Array
            (
                [ab] => https://example.com/eins
                [ac] => https://example.com/drei
                [ba] => https://example.com/vier
                [bd] => https://example.com/zwei
                [bh] => https://example.com/fuenf
            )
            Damit sind die Links nach Linkname sortiert. Wenn man lieber nach URI sortieren möchte, nimmt man asort anstelle von ksort..

            Kommentar


            • #7
              Erstmal Danke soweit.
              Ich bin schon weiter gekommen aber bekomme es nicht komplett fertig.
              PHP-Code:
              $wordsexplode(','$allnames);//name des Link
              $linksd=explode(','$alllinks);  //link davon
              $last_entry null;

              function 
              sortieren($words,$linksd){
                 foreach ( 
              $words as $key=>$value ){
                   
              $new_array[$value] = $linksd[$key];  
                 }
                 
              ksort($new_array);
                 return 
              $new_array;
              }

              function 
              gruppieren($new_array,$sammeln,$last_entry){
                 foreach (
              $new_array as $current_entry => $link){
                     
              $first_char $current_entry[1];
                     
              $char=$first_char;
                     
              $char=ucfirst($char);
                     if (
              $char != $last_entry) {
                         
              $sammeln.='Buchstabe: ' $char '<br>';
                     }
                     
              $sammeln.="<a href='$link'>$current_entry</a><br>\n";  
                     
              $last_entry $char;
                 }
                 return 
              $sammeln;
              }

              $sammeln=gruppieren($new_array=sortieren($words,$linksd),$sammeln=null,$last_entry);
              echo 
              $sammeln
              Ich habe es mal mit und ohne mehrdimensionale arrays ausprobiert und nach vielen hin und her habe ich es so gemacht .
              Da die arrays schon als 2 angekommen sind wahr das auch die einfachste Lösung meiner Meinung nach.

              Frage zum Code.
              Kann ich das mit den Functionen so lassen oder ist das übertrieben ?
              Der Code würde ja auch ohne Functionen laufen.

              Zu meinen letzten Problem.
              Die Ausgabe ist jetzt sortiert und in Gruppen. Doch das ABC wird einmal von A-Z in groß angezeigt und in a-z klein.
              Ich habe da groß und kleinschreibung in den arrays drinne.

              Wie man im Code sehen kann habe ich versucht den ersten Buchstaben immer in groß sortieren zu lassen mit ucfirst() und auch strtoupper() habe ich versucht.
              Beides zeigt keine wirkung und es werden trotzdem noch 2 mal abc angezeigt.
              Was mache ich da falsch ?
              und ich habe noch eine Fehlermeldung wo ich nicht weiß wie ich die beseitigen kann
              Code:
              Notice: Uninitialized string offset: 1 in /example.com/abc-test.php on line 179  // hier zeile 15
              Ich mach keine Rechtschreibfehler - ich schreib Freestyle!
              Erreichbar in mein Javascript-Forum und in Facebook-Chat

              Kommentar


              • #8
                Hier noch mal der Gruppenwechsel

                PHP-Code:
                // Ausgabe als Liste mit Gruppenwechsel
                $last_entry null;
                $out null;

                // Elemente durchlaufen
                foreach ($new_array as $key=>$value) {

                    
                $first_char strtolower($key[0]); // erstes Zeichen Kleinschreibung des aktuellen Schlüsselwertes

                    // Gruppenbruch, neuer Anfangsbuchstabe
                    
                if ($first_char != $last_entry) {
                        
                $out .= '</ul><h3>Buchstabe: ' $first_char '</h3><ul>';
                    }
                    
                $out .= '<li><a href="' $value '">' $key '</a>';

                    
                // neuen Vergleichswert setzen
                    
                $last_entry $first_char;
                }

                // erstes schliessendes ul abschneiden und letztes dranhängen
                $out substr($out5) . '</ul>';  

                echo 
                $out
                Lasst du das strtolower aus, dann hast du a A b B... als Gruppierung, so nur a b c... und mit strtoupper A B C...

                Ob du das in eine Funktion packst kommt drauf an ob du das mehrfach einsetzt. Ich halte es so, das alles was innerhalb einer Applikation nur ein mal verwendet wird kommt in keine Funktion.
                Es schadet aber nicht es in eine Funktion zu packen.

                Kommentar


                • #9
                  Zitat von protestix Beitrag anzeigen
                  PHP-Code:
                  $a = array("ab""bd""ac""ba""bh");
                  $b = array("https://example.com/eins""https://example.com/zwei""https://example.com/drei""https://example.com/vier""https://example.com/fuenf");

                  foreach ( 
                  $a as $key=>$value ){
                      
                  $new_array[$value] = $b[$key];
                  }

                  ksort($new_array);

                  echo 
                  "<pre>";
                  print_r($new_array);
                  echo 
                  "</pre>"
                  Dein foreach sieht nach einem array_combine aus (und evtl asort anstatt ksort?):

                  PHP-Code:
                  $a = array("ab""bd""ac""ba""bh");
                  $b = array(
                      
                  "https://example.com/eins",
                      
                  "https://example.com/zwei",
                      
                  "https://example.com/drei",
                      
                  "https://example.com/vier",
                      
                  "https://example.com/fuenf"
                  );

                  $new_array array_combine($b$a);
                  asort($new_array);

                  echo 
                  "<pre>";
                  print_r($new_array);
                  echo 
                  "</pre>"

                  Kommentar


                  • #10
                    Mache daraus ein
                    $new_array = array_combine($a, $b);

                    Dann passt es wieder mit dem ksort

                    oder möchtest du die langen links lieber als key im Array haben, dann ja.

                    Kommentar


                    • #11
                      ich verstehe es irgendwie nicht. Egal was ich versuche ich bekomme immer für jeden Buchstaben 2 Gruppen . Einmal A und a. Das bei jeden Buchstaben. Aber ich wollte groß und kleinschreibung in einer Gruppe haben.
                      er schmeist mir erstmal alle Links von A-Z aus und danach von a-z . Nur wie bekomme ich das in eine Gruppe ?
                      Das mit strtolower() den ersten Buchstaben umwandeln klappt nicht richtig.Die Sortierung bleibt immer noch so wie ich sie nicht haben wollte.
                      Ich mach keine Rechtschreibfehler - ich schreib Freestyle!
                      Erreichbar in mein Javascript-Forum und in Facebook-Chat

                      Kommentar


                      • #12
                        ok sorry. Habe es jetzt doch hinbekommen und zwar so.
                        PHP-Code:
                        $wordsexplode(','$allnames);//name des Link
                        $linksd=explode(','$alllinks);  //link davon
                        $last_entry null;

                        function 
                        sortieren($words,$linksd){
                           foreach ( 
                        $words as $key=>$value ){
                           
                        $value=strtolower($value);
                             
                        $new_array[$value] = $linksd[$key];  
                           }
                           
                        ksort($new_array);
                           return 
                        $new_array;
                        }

                        function 
                        gruppieren($new_array,$sammeln,$last_entry){
                           foreach (
                        $new_array as $current_entry => $link){
                               
                        $char $current_entry[1];
                               if (
                        $char != $last_entry) {
                                   
                        $sammeln.='Buchstabe: ' strtoupper($char) . '<br>';
                               }
                               
                        $tobig=ucwords($current_entry);//ucfirst() geht nicht
                               
                        $sammeln.="<a href='$link'>$tobig</a><br>\n";  
                               
                        $last_entry $char;
                           }
                           return 
                        $sammeln;
                        }
                        $sammeln=gruppieren($new_array=sortieren($words,$linksd),$sammeln=null,$last_entry);
                        echo 
                        $sammeln
                        Doch eineFrage habe ich da noch. In der einen Zeile steht ja ucwords() , was auch funktionieren zut. Doc sieht doof aus wenn ein ganzer Satz bei jeden Wprt Groß geschrieben wird. Das wollte ich so machen das nur der aller erste Buchstaben des Satzes groß geschrieben wird . Dazu habe ich ucfirst() versuche aber da ändert sich gar nix.
                        Hat da einer nee erklärung für ?


                        EDIT: Ok habe Fehler gefunden. Der erste Buchstabde ist bei mir ein Leerzeichen gewesen deshalb hat ucfirst() nicht funktioniert. Warum aber das ucwords() funktioniert hat verstehe ich trotzdem nicht . Ok danke an alle die mir hier geholfen haben.

                        Nur ein problem bleibt noch das ich diese Fehlermeldung habe
                        Code:
                        Notice: Uninitialized string offset: 1 in /example.com/abc-test.php on line 186
                        Das konnte ich noch nicht beheben , bzw finden
                        Ich mach keine Rechtschreibfehler - ich schreib Freestyle!
                        Erreichbar in mein Javascript-Forum und in Facebook-Chat

                        Kommentar


                        • #13
                          on line 186
                          und woher sollen wir wissen welche Zeile das sein soll? Unsere Beispiele und auch dein Code haben gar nicht so viele Zeilen.

                          Kommentar


                          • #14
                            Dürfte die sein:

                            PHP-Code:
                            $char $current_entry[1]; 
                            Schau halt mal nach was in $current_entry drin ist zur Zeit wo die Notice geworfen wird.

                            Kommentar


                            • #15
                              Raten bringt nicht viel, er soll mitwirken bei seinem Problem, oder es lassen.

                              Kommentar

                              Lädt...
                              X