phpler: Letztes Element löschen und vorne neuen anhängen

Hallo zusammen

habe das folgende Problem ich habe eine Variable mit Beispiel folgendem Wert:

  
$var = "111;222;33333;4444";  

Nun soll das letzte "Element" bis zum ; entfernt werden damit ich vorne wieder eine Zahl anfügen kann. Das Problem ist ja nur das die Zahl immer unterschiedliche Stellen hat.

Hat da jemand einen Typ für die passende Funktion?

Danke und Gruss

  1. Hallo zusammen

    habe das folgende Problem ich habe eine Variable mit Beispiel folgendem Wert:

    $var = "111;222;33333;4444";

    
    > Hat da jemand einen Typ für die passende Funktion?  
    
    Mit [explode](http://php.net/manual/de/function.explode.php) zum Array, mit [array_pop](http://php.net/manual/de/function.array-pop.php) das letzte Element verwerfen, mit [array_unshift](http://www.php.net/manual/de/function.array-unshift.php) neue Elemente am Anfang einfügen und mit [implode](http://www.php.net/manual/de/function.implode.php) wieder zum String.  
      
    Wenn bei den Veränderungen die Anzahl der Elemente gleich bleibt, kann man auch mit einer for-Schleife rückwärts durch das Array durchlaufen und immer das aktuelle mit dem X. vorangehenden Element ersetzen. Danach dann den ersten X Elementen neue Werte zuweisen und dann wieder mit implode zum String  
      
    MfG  
    bubble
    
    1. Mit explode zum Array, mit array_pop das letzte Element verwerfen, mit array_unshift neue Elemente am Anfang einfügen und mit implode wieder zum String.

      Danke für Deine Antwort. Ich stehe am Problem von array_unshift. Er fügt mir nun das Beispiel hinten dran.

      explode:  
      Array ( [0] => 2367 [1] => 2034 [2] => 1900 [3] => 1849 )  
        
      array_pop: 1849  
        
      array_unshift: Array ( [0] => Array ( [0] => 2367 [1] => 2034 [2] => 1900 ) [1] => 2025 ) 
      

      Jetzt habe ich zwei Arrays und das "neue" ist hinten dran.

      Hilfe :(

      1. array_unshift: Array ( [0] => Array ( [0] => 2367 [1] => 2034 [2] => 1900 ) [1] => 2025 ) [/code]

        Wie rufst du array_unshift auf?

        MfG
        bubble

    2. Hallo,

      $var = "111;222;33333;4444";

      
      > Mit [explode](http://php.net/manual/de/function.explode.php) zum Array, mit [array_pop](http://php.net/manual/de/function.array-pop.php) das letzte Element verwerfen, mit [array_unshift](http://www.php.net/manual/de/function.array-unshift.php) neue Elemente am Anfang einfügen und mit [implode](http://www.php.net/manual/de/function.implode.php) wieder zum String.  
        
      Der Ansatz ist ja recht nett, aber für mein Empfinden overkill für Strings, verbraucht unnötig Speicher und Rechencyklen, das ist natürlich bei einem so kurzen String eher kein Problem, wenn es länger wird oder sehr viel öfter aufgerufen wird dann möchte man vielleicht doch was schnelleres haben. Hier ist mein Ansatz:  
        
      ~~~php
      <?php  
      $string = "123;456;789;101112;131415";  
      $semicolon_position = strlen($string);  
      while($string[--$semicolon_position] != ";") {}  
      $new_string = substr($string, 0, $semicolon_position);  
        
      echo $new_string."\n";
      

      Ich laufe den String von hinten durch und gucke an jeder Stelle ob der Buchstabe ein Semikolon ist, falls nicht, dann gehe ich zum nächsten, falls ja dann mache ich einen neuen String draus der von vorne bis zu dieser Position geht.

      /Jeena

      1. Hallo,

        <?php

        $string = "123;456;789;101112;131415";
        $semicolon_position = strlen($string);
        while($string[--$semicolon_position] != ";") {}
        $new_string = substr($string, 0, $semicolon_position);

        echo $new_string."\n";

          
        Und natürlich haben sich gefährliche Bugs eingeschlichen, falls es kein Semikolon im String gibt dann läuft das while unendlich lange, also noch ein Versuch:  
          
        ~~~php
        <?php  
        $string = "123;456;789;101112;131415";  
        $semicolon_position = strlen($string);  
        while($semicolon_position > 0 && $string[--$semicolon_position] != ";") {}  
        $new_string = substr($string, 0, $semicolon_position);  
          
        echo $new_string."\n";
        

        /Jeena

        1. Hi,

          Und natürlich haben sich gefährliche Bugs eingeschlichen,

          das passiert, wenn man auf die Schnelle versucht, Standard-Funktionen nachzubauen.
          strrpos existiert.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          1. Hallo,

            das passiert, wenn man auf die Schnelle versucht, Standard-Funktionen nachzubauen.
            strrpos existiert.

            Ah perfekt, das macht das ganze natürlich noch viel einfacher.

            /Jeena

            1. Hallo,

              So noch ein Versuch, mit Hilfe von MudGuards strrpos():

              <?php  
              $string = "123;456;789;101112;131415";  
              $new_string = substr($string, 0, strrpos($string, ";"));  
                
              echo $new_string."\n";
              

              Ich bin ja gestern die stringfunktionen da durchgegangen und hab diese in der PHP doku nicht gefunden, aber ich will hier nicht schon wieder ausbreiten was ich von der Namensgebung von PHP-funktionen so halte ...

              /Jeena

              1. Hallo,

                So, und jetzt zum Schluss wiederlege ich alles was ich gesagt habe, denn die Array funktionen sind um ein vielfaches schneller wenn man es mal misst:

                while:    3.4940791130066
                string:   4.9904410839081
                array:    1.2572290897369

                Warum das so ist, da kann ich nur spekulieren, aber explode() und implode() werden wohl sehr viel Optimierung erfahren haben weil sie so oft genau dafür benutzt werden und man das intern in C viel schneller lösen kann als ich es hier mit meinem index-zugriff und einer while()-Schleife.

                Warum strrpos() so langsam ist weiß ich allerdings nicht, das ist ja sogar langsamer als meine while()-Schleife mit index-zugriff.

                Hier der Code den ich zum Messen benutzt habe:

                <?php  
                $array = array();  
                  
                for ($i=0; $i < 10000; $i++) {  
                    array_push($array, rand(0, 1000));  
                }  
                  
                $string = implode(";", $array);  
                $times = 1000000;  
                  
                  
                $start = microtime(true);  
                for ($i=0; $i < $times; $i++) {  
                    $semicolon_position = strlen($string);  
                    while($semicolon_position > 0 && $string[--$semicolon_position] != ";") {}  
                    $new_string = substr($string, 0, $semicolon_position);  
                }  
                echo "while:    " . (microtime(true) - $start) . "\n";  
                  
                  
                $start = microtime(true);  
                for ($i=0; $i < $times; $i++) {  
                    $new_string = "0;" . substr($string, 0, strrpos($string, ";"));  
                }  
                echo "string:   " . (microtime(true) - $start) . "\n";  
                  
                  
                $start = microtime(true);  
                for ($i=0; $i < $times; $i++) {  
                    $arr = explode($string, ";");  
                    array_pop($arr);  
                    array_unshift($arr, "0");  
                    $new_string = implode(";", $arr);  
                }  
                echo "array:    " . (microtime(true) - $start) . "\n";  
                
                

                /Jeena

                1. Hallo,

                  Warum strrpos() so langsam ist weiß ich allerdings nicht, das ist ja sogar langsamer als meine while()-Schleife mit index-zugriff.

                  Das ist es natürlich nicht, nur mein Test war falsch geschrieben, ich habe vergessen da das "0;" vor den neuen String zu hängen, schlussendlich kommen diese Zahlen dabei raus:

                  while:    5.5468089580536
                  string:   4.5493469238281
                  array:    1.1223878860474

                  /Jeena

                  1. while:    5.5468089580536
                    string:   4.5493469238281
                    array:    1.1223878860474

                    Zum einen vermute ich jetzt (über die Geschwindigkeit hatte ich mir nicht wirklich Gedanken gemacht), dass die Arrays, soviel schneller sind, weil sie ja in PHP nicht wirklich reine Arrays sind.
                    Zum anderen ging es mir darum, aufzuzeigen, dass man eventuell mit dem String als Datenhaltung vielleicht fehl am Platze ist. Mit reinen String-Methoden wird es schwer, wenn man auf einmal doch mehr als ein Element löschen/anfügen möchte. Klar man könnte die Routine X-mal durch laufen lassen, das bedeutet aber auch zeitgleich, dass man die anzufügenden Element rückwärts abarbeiten muss, dass sie in der richtigen Reihenfolge am Anfang stehen. Und wenn man meinetwegen mal das 5. Element braucht, hat man gleich ganz verk*ckt.

                    MfG
                    bubble

                    --
                    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
  2. @@phpler:

    nuqneH

    habe das folgende Problem ich habe eine Variable mit Beispiel folgendem Wert:
    $var = "111;222;33333;4444";

    Bist du sicher, dass du nicht eigentlich ein Array willst?

    $var = array(111,222,33333,4444);
    bzw.
    $var = array('111','222','33333','4444');

    Dann wärst du mit Array-Funktionen dabei.

    Wenn du doch Stringverarbeitung willst, dann eben Stringfunktionen.

    Hat da jemand einen Typ für die passende Funktion?

    Netter Tipo.

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Hallo,

      Hat da jemand einen Typ für die passende Funktion?
      Netter Tipo.

      den gibt's bei FIAT. ;-)
      Hmm ... Oder ist der schon wieder passé?

      Ciao,
       Martin

      --
      Männer sind ungerecht: Sie sehen immer nur den Baum, den eine Frau mit dem Auto gerammt hat. Aber die vielen Bäume, die sie nicht einmal gestreift hat, sehen sie nicht.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hmm ... Oder ist der schon wieder passé?

        Bravo!

        Gruß
        Kalk

  3. Moin,

    Hat da jemand einen Typ für die passende Funktion?

    Türlich, am besten wäre wohl für diesen Fall eine passende Funktion vom Typ "string".

    Grüße Marco