Visualizzazione risultati 1 fino 8 di 8

Discussione: Aiuto operazioni aritmetiche in php

  1. #1
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito Aiuto operazioni aritmetiche in php

    Salve a tutta la community..
    Avrei bisogno dei vostri consigli, per risolvere questo problema..

    Vorrei trasformare il valore in base quattro alternative a $mes. Con $lung = strlen((int)$text); recupero il numero dei caratteri, successivamente faccio un if ($lung<613) è $mes = ($lung<161) sia al valore di $mes=1;, mentre $mes = ($lung>160) sia al valore $mes=2, >306 sia al valore $mes=3 è >459 a 4.

    ecco il
    Codice:
    if ($lung<613) {
     $mes = ($lung<161!==1);
     $mes = ($lung>160!==2);
     $mes = ($lung>306!==3);
     $mes = ($lung>459!==4);
    }
    sono nuovo di php, è sicuramente sbaglierò qualcosa.
    Perché qualunque sia la dimensione di $lung equivale a $mes=1. Voi come fareste?

    Spero in un vostro aiuto, grazie.
    Ultima modifica di darbula : 02-06-2012 alle ore 14.12.50

  2. #2
    Guest

    Predefinito

    Aspetta, fammi vedere se ho capito:
    Codice PHP:
    if ($lung <= 160)
    $mes = 1;
    elseif (
    $lung <= 306)
    $mes = 2;
    elseif (
    $lung <= 459)
    $mes = 3;
    elseif (
    $lung <= 612)
    $mes = 4;
    EDIT: le espressioni del tipo $lung<161 !== 1 restituiscono valori booleani (true, false). Nella fattispecie risultano sempre vere, poiché si valuta prima $lung<161, che risulta essere un valore booleano, dunque sicuramente diverso (facendo un controllo anche sul tipo, come avviene con l'operatore !==) da un numero intero.
    L'espressione risulta quindi sempre vera, e in $mes ti trovi il valore true, che viene rappresentato come 1.
    Ultima modifica di tryphpnuke : 02-06-2012 alle ore 14.20.39

  3. #3
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Intanto grazie ora proverò il tuo codice!!
    Già avevo provato con le graffe ed i elseif, però mi dava errore la graffa, vediamo se la escludo che succede.

    Quasi giusto, $mes =1 minore di 160, $mes = 2 maggiore di 160 (non minore o uguale 160) è così via per gli altri.

    EDIT:
    mi serve che l' if non venga eseguito se si superano i 612 caratteri.
    Ultima modifica di darbula : 02-06-2012 alle ore 14.32.18

  4. #4
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Quasi giusto, $mes =1 minore di 160, $mes = 2 maggiore di 160 (non minore o uguale 160) è così via per gli altri.
    E quindi, scusa, il caso di lunghezza uguale proprio a 160 è fuori discussione?

  5. #5
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Hai mai preso in considerazione di usare le divisioni?
    Dividi la lunghezza del testo per un determinato numero di caratteri, approssimando per eccesso.

    Codice PHP:
    $mes = ceil($lung / 160);
    $mes sarà uguale ad 1 se il testo è inferiore di 160 caratteri, 2 se superiore a 160 e inferiore di 320, n se superiore a (n - 1) * 160 e inferiore di n * 160.

    Poi se vuoi farlo nei particolari, usa gli if.

  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ops, scusa @tryphpnuke.
    errore di digitazione!!!

    EDIT: qualsiasi codice, mi da sempre $mes=1, possibile che gli elseif non funzionano?
    Codice PHP:
    <?php
    if ($lung<161)
    $mes = 1;
    elseif (
    $lung>160)
    $mes = 2;
    elseif (
    $lung>306)
    $mes = 3;
    elseif (
    $lung>459)
    $mes = 4;
    else echo(
    "Testo troppo lungo");
    ?>
    @javascripter dipende dai casi, per esempio invece di arrotondare al numero successivo di quello intero (cioè 1.66 diventa 2) con "ceil", arrotondo con "%" modulo al numero intero (cioè 1.66 diventa 1), simile a floor che accetterebbe anche divisioni con virgola mobile, mentre % solo divisioni tra due interi.

    Già lo script, faceva uso di floor è divideva $lung per 160 nel caso il testo era inferiore a 161 caratteri, altrimenti lo divideva per 153..

    Credo che vi chiediate perché così,vero?
    Risposta, siccome i caratteri degli sms concatenati sono: 1°=160, 2°=146, 3°=153, 4°=153 è successivi uguali a 153.

    Voglio rendere più elegante $mes. Invece di dividere $lung/ per 160 o 153.
    Ultima modifica di darbula : 02-06-2012 alle ore 18.30.07

  7. #7
    Guest

    Predefinito

    Darbula: No, così gli ultimi due elseif e l'else non servono a niente, perché se metto un testo lungo 1000 caratteri, entra subito nella clausola $lung > 160. Se lo scopo è quello che dicevi, allora puoi fare così:
    Codice PHP:
    if ($lung <= 160)
    $mes = 1;
    elseif (
    $lung <= 160 + 146)
    $mes = 2;
    else
    $mes = 2 + ceil(($lung - 160 - 146) / 153);

    # Poi, se vuoi evitare che i messaggi siano più di 4:
    if ($mes > 4)
    echo
    "Messaggio troppo lungo.";
    Testato e funziona.

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Grazie tryphpnuke per il tuo aiuto.

    Come già detto usavo questo
    Codice PHP:
    <?php
    if ($lung<161)
    $lung_def=160;
    else
    $lung_def=153;
    $mes=$lung/$lung_def;
    $mes=floor($mes);

    if ((
    $mes*$lung_def)<$lung)
    $mes=$mes+1; //aggiungo uno agli sms
    //per poi recuperare i crediti attuali dopo l'invio (credits-mes)
    altro codice che non scrivo, perché non pertinente a questo argomento
    ?>
    Il mio intento era di creare uno script php "universale", capace di dividere il testo come fanno gli sms standard.
    Però per i messaggi che hanno già impostato un tot di caratteri, lo script descritto in precedenza va a farsi benedire.

    Grazie, non lo sapevo che l'if funzionasse così. Sei molto gentile.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •