PHP String von rechts "abschneiden"

...komplette Frage anzeigen

3 Antworten

explode trennt nicht nur beim ersten Vorkommen des Trennzeichens

$a = explode( "Artikelnummer Artikelname 12,34 €", " ");

ergibt

$a[0]: "Artikelnummer"
$a[1]: "Artikelname"
$a[2]: "12,34"
$a[3]: "€"

Auf das Element mit dem Betrag kannst du mittels $a[count($a)-2 zugreifen.


Eine Andere möglichkeit wäre, vor dem explode ein string reverse (strrev) durchzuführen und dann beim $a[1] wieder "umkehren".


Du solltest dir generell überlegen, ob es nicht sinnvoll wäre, ein anderes, nicht so häufig auftretendes Trennzeichen zu verwenden. Beliebt ist das Semikolon. Du kannst aber auch "[MeinTrenner]" verwenden, um sicherzugehen, dass der Artikel das Trennzeichen nicht im Text hat oder die einzelnen Elemente mit Anführungszeichen umschließen. Oder du steigst auf XML um.

Suboptimierer 05.03.2014, 16:37

PS: Eventuell kannst du noch mit dem Limit-Parameter von explode spielen, um sicherzustellen, dass wirklich an jedem Trennzeichen getrennt wird.

0
NotYou22 05.03.2014, 17:46

Ich hab es mir jetzt anders überlegt: Ich schreib einfach Preis und Artikelnamen in 2 verschiedene .txt-Dateien. Die trenn ich dann einfach sodass ich am Ende $Artikel[0]="Artikelname" und $Preis[0]=" zugehöriger Preis". Ist wahrscheinlich weniger Schreibarbeit, und für mich deutlich übersichtlicher ;)

Trotzdem Danke!

0
Suboptimierer 05.03.2014, 18:02
@NotYou22

Ist aber riskant.

Sobald eine Leerzeile sich einschleicht oder ähnliches, hast du ein Verschiebungsfehler, der sich fortpflanzt. Es muss sichergestellt sein, dass die Dateien manuell nicht angefasst werden.

Ich würde wenigstens in die Dateien die Artikelnummer pro Zeile aufnehmen. So ist die eindeutige Zuordnung gewährleistet.

Noch besser wäre es, wenn du sowieso schon php verwendest, wenn du die Daten in einer Datenbank speichern würdest und für jedes Attribut eine Spalte verwenden würdest.

0

Benutz doch einen regulären Ausdruck:

$artpr = "Dein Artikelname 3,00€";
$m = array();
preg_match("/\\d+(\\s*,\\s*\\d+)?\\s*(€|Euro|Eur)/i",$artpr,$m);

$name = trim(str_replace($m[0],"",$artpr)); //entfernen des Fundes (Preis) im String
//$m[0] enthält Preis ("3,00€")
//$m[1] enthält nur den Zahlenwert des Preises ("3,00")

Hab ich jetzt aus dem Kopf gemacht, musst du mal schauen ob das so klappt. Der reguläre Ausdruck ist sicherer bzgl. der Erkennung vom Preis weil er nach einem angegebenen Muster sucht. Ob da jetzt "3€" steht oder "3 €" oder "3,12 €" oder "3, 12 Euro" ist egal, das erkennt er.

Hello there,

darf ich mal fragen, warum du da mit .txt-Dateien arbeitest? Hast du keine Datenbank, die sowas verwaltet? Mit Datenbanken wäre das doch alles ein Klacks. Du hast die Artikel in einer Tabelle, du hast die Kunden inner zweiten Tabelle. Die Sessions in einer weiteren Tabelle. Und den Warenkorb legst du als weitere Tabelle an, die in etwa so aussieht:

CREATE TABLE tblWarenkorb
(
eintrag_ID INT NOT NULL AUTO_INCREMENT,
benutzer INT,
artikelnummer INT,
PRIMARY KEY eintrag_ID,
FOREIGN KEY (benutzer) REFERENCES tblBenutzer(Benutzer_ID),
FOREIGN KEY (artikelnummer) REFERENCES tblArtikel(Artikel_ID),
);

Und wenn du dann für nen speziellen Benutzer den Warenkorb generieren lässt, sagste einfach in einer Abfrage:

SELECT Artikelnummer FROM tblWarenkorb WHERE Benutzer = Benutzer der aktuellen Session

Also ich weiß ja nicht, was du machst, bzw machen willst. Aber kommt für dich diese Option evtl in Betracht? Wenn ja möchte ich sie dir empfehlen.

NotYou22 05.03.2014, 21:21

Ich weiss^^ Das Ganze ist kein echter Shop, sondern nur für ein Informatik-Projekt. Und unsere, sehr wahrscheinlich selbst ernannte, "Informatik-Lehrerin" kann selbst kaum PHP, geschweige denn SQL, was wir im Unterricht nie gemacht haben. Für selber beibringen hatte ich dann leider keine Zeit mehr, da ich schon für die anderen Sachen, die unsere Lehrerin uns nicht erklären kann, im Internet rumgooglen musste!

0
Alextoexplain 05.03.2014, 22:29
@NotYou22

Ouh du Armer :(. Das dann bescheiden. Inkompetente Lehrer sind ne Heimsuchung :)

0

Was möchtest Du wissen?