Letztes Element löschen und vorne neuen anhängen
phpler
- php
0 bubble0 phpler0 bubble
0 Jeena Paradies
0 Gunnar Bittersmann0 misterunknown
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
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
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 :(
array_unshift: Array ( [0] => Array ( [0] => 2367 [1] => 2034 [2] => 1900 ) [1] => 2025 ) [/code]
Wie rufst du array_unshift auf?
MfG
bubble
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
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
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
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
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
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
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
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
@@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'
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
Hmm ... Oder ist der schon wieder passé?
Bravo!
Gruß
Kalk
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