• Moin Moin,

    hier sind ja auch ein paar Programmierer ;)

    ich hab ganz viele Seriennummern so in etwa 35310500700102456 von der 3 bis 6 Ziffer kann ich den Typ des Gerätes bestimmen - also 105 wie kann ich das mit php umsetzen ? also er müsste immer die 4, 5 und 6 Ziffer auslesen.

    vielleicht kann mir einer helfen

    danke

  • Aw: PHP Stringlänge

    Hallo,
    schau dir mal *** Link veraltet *** an!

    PHP
    <?php
    $var = '35310500700102456';
    $var = substr($var,-14,3);
    echo $var;
    ?>

    Und da es eventuell hilft, da ich es heute auch brauchte - um vorne oder hinten den String zu ergänzen *** Link veraltet ***
    Grüße

    /edit: die Hochkommas zählen natürlich auch ;)

  • Aw: PHP Stringlänge

    Ist so aber schon ein wenigen "umständlich". Warum zählst Du von rechts -14 und nicht von links +3 ? Was, wenn die Seriennummer mal länger oder kürzer ist? Er sagte ja, es ist immer der Bereich 4, 5 und 6, also würde ich da von links zählen.

    echo substr('35310500700102456', 3, 3); // 105

    Zitat

    /edit: die Hochkommas zählen natürlich auch


    Wie meinst Du das? Wo sollen die Hochkommata zählen? Die zählen gar nicht ;) Nur der Zähler beginnt bei 0, nicht bei 1 - somit ist Zeichen 4 auch Position 3 bzw. in Deiner Version Position -14 eben Zeichen -15.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Aw: PHP Stringlänge

    Zitat von "Synonym" post=4586

    Was, wenn die Seriennummer mal länger oder kürzer ist?

    Zitat von "bazillus" post=4582

    *** Link veraltet ***


    Erwähnte ich aber schon im ersten Beitrag (der von mir!) und hätte dir auffallen können, schließlich hast Du ja sonst auch alles sehr genau gelesen ;)

  • Aw: PHP Stringlänge

    Ja klar, das habe ich gesehen, nur warum dieser Umweg. Da müsste man also definieren, dass eine Nummer immer z.B. 15 Stellen haben muss. Ist die länger, dann muss man was abschneiden, ist sie kürzer, dann muss man was anhängen. Das Ende der Nummer ist doch aber völlig egal, wenn man von links gesehen anfängt ;) Gut, ganz egal ist es nicht, die Stellen 4,5 und 6 müssen natürlich vorhanden sein.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Aw: PHP Stringlänge

    Zitat von "Synonym" post=4625

    Das Ende der Nummer ist doch aber völlig egal, wenn man von links gesehen anfängt ;) Gut, ganz egal ist es nicht, die Stellen 4,5 und 6 müssen natürlich vorhanden sein.

    Der Anfang der Nummer ist auch egal, wenn man von rechts anfängt ;) Genauso kann es bei beiden Versionen Probleme geben, sobald sich irgendwas an der Länge ändert. Wir wissen aber nicht, wenn sich was ändert, ob li oder re abgeschnitten/hinzugefügt wird. Es müsste also theoretisch in beiden Fällen eine Überprüfung der Länge durchgeführt werden und ergänzt, oder abgeschnitten werden.
    Deswegen ist es müßig über von li oder re zu diskutieren - wir wissen zu wenig über den Aufbau des Strings.
    Wenn der String immer so aufgebaut ist, funktionieren beide Versionen. Ich hab übrigens von re angefangen, da meistens von rechts nach links aufgefüllt wird.
    Also
    0001
    0002
    ...
    0010
    hat in diesem Falle aber keinen Einfluss... aber z.B. bei einer Zählschleife, wo man jeweils die letzte Nummer braucht um z.B. immer bei 0 oder 5 was auszugeben. Kommt halt einfach nur auf den Anwendungsfall an und wenn der String immer die gleiche Länge hat, ist unsere Diskussion überflüssig, da beides funktioniert. :bierchen:

    Grüße

  • Aw: PHP Stringlänge

    Ja ne, er hatte ja geschrieben:
    "also er müsste immer die 4, 5 und 6 Ziffer auslesen."

    Also ist es egal ob oooXXXooo (4, 5 und 6 von 9) oder oooXXXoooooooo (4, 5 und 6 von 14) oder oooXXXooooooooooooooooooo (4, 5 und 6 von 25). Von links ist es also immer der gleiche Abstand. Wenn dem nicht so wäre, also die Position der Kennung unterschiedlich ist, dann funktioniert keine der Versionen, da man dann erst mal festlegen müsste, wo genau sich die Kennung befindet.

    Wenn es immer die gleiche Länge ist, dann ist es in der Tat schnuppe, da gehen beide Versionen.
    Ist die Länge variabel und die Position immer gleich, dann meine Version.
    Ist die Position und oder die Länge variabel, dann keine von beiden (ohne Angabe der speziellen Position).

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Aw: PHP Stringlänge

    danke ihr Freaks ;) - hab auch gleich das nächste - da ich die ganzen Seriennummern über einen CSV upload bekommen - möchte ich die Seriennummer auslesen aus der Seriennummer eben den Typ und beides dann in einer DB schreiben ;) ist das so richtig ?

    $uploadDir = 'fileadmin/';
    $uploadFile = $uploadDir . $_FILES['userfile']['name'];
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadFile)) {
    $csvFile = 'fileadmin/'.$_FILES['userfile']['name'];
    $seriennummern = file($csvFile);

    $value_array = array();
    foreach ($seriennumern as $serie) {
    list($id, $string) = explode(';', $serie);

    $typ = substr($string,-14,3);

    $value_array[] = $GLOBALS['TYPO3_DB']->exec_INSERTquery('tx_geraeteinfo',array(
    'pid'=>$this->id,
    'typ' => $typ,
    'serialnummer'=>$string
    ));
    }
    }

    Grüße

  • Aw: PHP Stringlänge

    Also hier habe ich nun die Frage wohl nicht so ganz verstanden und von Typo3 habe ich keine Ahnung. Bei der Frage gehe ich aber mal davon aus, dass zu einmal die Seriennummer komplett und einmal nur die Kennung speichern willst, also einmal 35310500700102456 und einmal das zugehörige 105, oder?

    Das CSV enthält pro Zeile wohl eine ID und einen mit Semikolon abgetrennten String. Der String ist die Seriennummer - soweit richtig?

    Wenn ja, dann scheint es zumindest was die "Filterung" des Typs betrifft zu stimmen.
    pid kommt vom System
    typ ist der Typ (Stelle 4, 5 und 6)
    string ist die komplette Seriennummer


    Aber Achtung:
    Ich kennen nun das CSV nicht und somit auch nicht dessen Aufbau.
    Beachte das hier bezüglich files():

    Zitat

    Jede Zeile in dem resultierenden Array enthält das Zeilenende, außer es wird FILE_IGNORE_NEW_LINES verwendet; daher müssen Sie trim() verwenden, falls das Zeilenende nicht vorhanden sein soll.


    Wenn eine Zeile nun also nicht mit ";" endet und somit das explode greift, dann steht am Ende des Strings noch der Zeilenumbruch. Wenn Du dann von rechts -14 zählst und am Ende noch die Zeichen für das Zeilenende stehen, dann stimmt das Ergebnis nicht. Also teste das mal mit echo durch und nicht direkt mit INSERT. Oder verwende den entsprechenden FILE_IGNORE_NEW_LINES, trim() oder zähle von links +3 oder von recht (-14 - Zeilenende).

    Sieht eine Zeile z.B. so aus
    1;35310500700102456;
    , dann wäre der TYP 105

    Sieht die aber so aus:
    1;35310500700102456
    , dann ist der TYP 500 (weil am Ende zwei nicht sichtbare Zeichen für den Zeilenumbruch stehen)

    Das ist mit ein Grund, warum ich von links und nicht von rechts zähle ;)


    Nachtrag: Du hast einen Schreibfehler. Einmal heißt es $seriennummern und einmal $seriennumern

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(