Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Preg Match e Uninitialized string offset

    Ciao a tutti ragazzi,
    Devo fare un programma che dati dei titoli dei libri,all' interno ci siano 2 o 3 numeri,
    tra loro almeno una lettera e, il nuovo numero (successivo) deve essere il multiplo di quello che lo precede.

    Funziona tutto ha solo due problemi (quindi non funziona al 100%)
    Problemi:
    1) Non funziona correttamente il preg_match ovvero funziona solo se metto almeno una lettera tra due numeri. esempio:
    Funziona -> ooo 1 oo 4 oo 8 oo
    NON funziona -> oo 1 4 oo 8 oo (vedete appena lascio uno spazio tra i due numeri già non funziona più) A me serve che ci deve essere sempre una lettera tra OGNI numero ! Non ci deve essere per forza 3 numeri ma anche due per esempio 2 blabla 8.

    2) l'altro problema che ho è che visto che devo calcolare i multipli non so come togliere lo 0 dal terzo elemento, prima mi dava l'errore Uninitialized string offset sono riuscito a risolvere mettendo un empty davanti, ma comunque non riesco a dirgli che quando $INT[3] è uguale a 0 non deve mostrarmelo...

    ecco il codice:
    Codice PHP:
    function filtrolibri6($fascicolo1){
                foreach  (
    $fascicolo1 as $chiave1 => $valore1){
                    if(
    preg_match('/[0-9].*[A-Za-z]{1}.*[0-9]/'$valore1)  == true){
                       
    $int filter_var($valore1FILTER_SANITIZE_NUMBER_INT);
                        if(
    $int[0] <> and $int[1] <> ){
                              if(
    $int[0] < $int[1] and empty($int[2])){
                              if(
    $int[1] % $int[0] == ){
                               
    $ok2[]= $chiave1 .'=>'$valore1;
                            }
                              }
                              if(
    $int[0] < $int[1] and !empty($int[2])){ 
                              if(
    $int[2] % $int[1] == ){           
                               
    $ok2[]= $chiave1.' '' => '$valore1;
                            }     
                              } 
                          }       
                    }
                    
                }
                return 
    $ok2;
    }
    $test2 filtrolibri6($fascicolo1);
    foreach(
    $test2 as $chiave2 => $prova2){ 
        echo 
    $prova2 "<br>"

    Come avete visto ho voluto fare l'echo all'esterno della funzione, perchè credo che sia più giusto.
    Un altra cosa, da poco ho iniziato a cimentarmi sul php ma quali altri modi avevo per fare questo esercizio? Cioè mi pare che si possa fare solo con le regex o no?

    Comunque vi ringrazio tantissimo se mi date una mano a risolvere quei due errori / imperfezioni.

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Per il punto 1 (cominciamo da questo). Dici che ci deve essere almeno una lettera tra 2 numeri e poi dici con se c’è uno spazio non funziona. Visto che lo spazio non è una lettera è normale se non funziona.
    Quindi qual’è la regola ?

    Deve per forza esserci almeno uno spazio tra un numero e una lettera e vice versa ? C’è almeno una lettera prima del primo numero ? Possono esserci altri caratteri in più delle lettere a-z tipo caratteri accentati o punteggiatura o apici o etc...

    Se con altri tipi di domande si puo’ non essere molto chiari con le regexp bisogna essere chiarisimi nella specifica perché anche la più piccola omissione farà si che funzionerà o no.

    facci alcuni esempi veri.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Intanto grazie per avermi risposto badaze,
    allora la regola è che ci deve essere sempre una lettera tra uno o due o tre ecc.. numeri non ci deve essere mai lo spazio.

    oo 1 o 2 -> deve funzionare
    1 o 2 -> deve funzionare
    o 2 o 4 o 8 -> deve funzionare
    2 o 4 o 8 -> deve funzionare

    1 o 3 9 -> non deve funzionare di conseguenza non deve farmelo vedere a schermo perchè non c'è almeno una lettera tra (in questo caso ) il secondo e terzo numero.

    Quindi ci deve essere sempre una lettera TRA due numeri, i numeri possono anche essere 2 mila, ma devono avere sempre una lettera fra di loro. (non è ammesso che lo spazio venga sostituita da una lettera).

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Prova questo. Testato pochissimo.

    Codice PHP:
    <?php
    $pattern1 
    "/^([a-zA-Z]+\s*(\d+)\s*)+$/";
    $pattern2 "/([a-zA-Z]+\s*(\d+)\s*)+?/";

    $testo   "2 o 4 ooooo 8 o 15 ";
    // aggiungo una lettera all'inizio visto che deve funzionare con e senza lettera all'inizio
    $finale  'o'.$testo;
    if (
    preg_match($pattern1,$finale) == 1)
    {
     print 
    "$testo funziona<br/>";
     
    preg_match_all($pattern2,$finale,$valore1);
     
    // $valore1[2] contiene i numeri - inverto l'ordine dell'array per avere sempre l'ultimo numero al primo posto
     
    $arrayNumeri array_reverse($valore1[2]);
     
    // controllo se l'ultimo è il doppio del penultimo
     
    if (isset($arrayNumeri[1]) && $arrayNumeri[0] == ($arrayNumeri[1] * 2))
     {
      print 
    "Ultimo doppio del penultimo.<br/>";
     }
     else
     {
      print 
    "Ultimo non doppio del penultimo.<br/>";
     }
     
    var_dump($arrayNumeri);
    }
    else
    {
     print 
    "$testo non funziona";
    }
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Grazie per avermi risposto,
    Sembra funzionare e bene anche ! Ho fatto una modifica ho aggiunto un foreach visto che in questo caso mi riferivo all'array fascicolo che conteneva tutti i libri,

    Codice PHP:
    $fascicolo1 = array( 'libro1' => '1 aa 4 aa 8',
                        
    'libro2' => '2 aa 4 aa 8',
                        
    'libro3' => '2 o 4 8 ',
                        
    'libro4' => '1 o 8 o 16 o  24'
    );




    $pattern1 "/^([a-zA-Z]+\s*(\d+)\s*)+$/";
    $pattern2 "/([a-zA-Z]+\s*(\d+)\s*)+?/";


    foreach(
    $fascicolo1 as $ok){
                
    $finale  'o'.$ok;
                if (
    preg_match($pattern1,$finale) == 1)
                {
                 print 
    "$ok funziona<br/>";
                 
    preg_match_all($pattern2,$finale,$valore1);
                 
                 
    // $valore1[2] contiene i numeri - inverto l'ordine dell'array per avere sempre l'ultimo numero al primo posto
                 
    $arrayNumeri array_reverse($valore1[2]);
                 
                 
    // controllo se l'ultimo è il doppio del penultimo
                 
    if (isset($arrayNumeri[1]) && $arrayNumeri[0] == ($arrayNumeri[1] * 2))
                 {
                  print 
    "Ultimo doppio del penultimo.<br/>";
                 }
                 else
                 {
                  print 
    "Ultimo non doppio del penultimo.<br/>";
                 }
                 
    var_dump($arrayNumeri);
                }
                else
                {
                 print 
    "$ok non funziona <br> ";
                }



    Mi è salito un dubbio ENORME, potrei aggiustarlo usando il metodo del modulo come avevo fatto, però se io devo creare una funzione, e quindi so benissimo che essendo una funzione non devo fermarmi sul fatto che possa essere utilizzato solo per i libri ma per qualunque cosa.

    Quindi mettiamo caso che io abbia sempre un altro fascicolo, con dei titoli dei libri....MA questi titoli contengono 20 numeri, com'è possibile che io debba andare nel codice e CITARE la posizione 20 del numero... mi sono spiegato? Cioè se io ho 2 mila numeri non posso permettermi di andare a mettere nel IF ogni volta $arraynumero[7] .... $arraynumero[8] ecc...

    Questa cosa è tosta che non riesco a capire quale potesse essere un metodo, appunto perchè è una funzione

    Ti ringrazio che mi segui

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Non capisco. Il codice che ho scritto ha sempre l’ultimo numero nel posto 0 dell’array ed il penultimo nel posto 1.
    Poi ovviamente che è da adattare ti deve pure restare un po’ si lavoro !
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.