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

    Sviluppare funzione su stringa

    La discussione è molto simile a quella che ho aperto qualche giorno fà, ma qui è spiegata meglio ed in modo generale, quindi ho pensato sia più comodo aprire una discussione cosi che anche i nuovi visitatore possano capire al volo.
    Praticamente in php ho stringa tipo questa:
    str = " 1 3 6 4 8";
    8 rappresenta un delimitatore
    4 è un valore che appartiene a 8
    6 rappresenta un delimitatore
    3 è un valore che appartiene a 6
    1 rappresenta un delimitatore (in questo caso il valore che gli appartiene è nullo, ovvero uno spazio)
    Sviluppare una funzione che dato in input il delimitatore, restituisca il suo valore
    Ovviamente noi conosciamo quali sono i vari delimitatori, e sappiamo solo che i
    rispettivi valori appartenenti ad essi si trovano sulla loro sinistra.
    La funzione deve lavorare per qualsiasi numero di delimitatori presenti (anche 1 solo),
    e deve funzionare anche se il valore del delimitatore è nullo (ovvero uno spazio, come nel caso del delimitatore 1).
    Aggiungo:
    io avevo pensato di poter sviluppare tale funzione con qualche ciclo annidato e con vari explode, ma sinceramente non sono un genio in materia e non ci sono riuscito.

    P.S.
    Non ragionate con i numeri, perchè la funzione deve lavorare anche con delimitatori tipo "ASDF£"F$" o valori tipo "alsdkfj"

  2. #2
    Utilita pratica di questa discussione? Risolvere un esercizietto? Se non riesci a pensarlo direttamete in php, scrivi a parole quello che dovrebbe fare l'algoritmo per risolvere il problema e poi traducilo in php
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    La butto così, anche se non c'ho capito molto. Se fai un explode con l'esempio che hai riportato, dopo ti ritroverai una situazione del genere:

    $var[0] // =1
    $var[1] // =3
    $var[2] // =6
    $var[3] // =4
    $var[4] // =8

    Dunque, se conosci il delimitatore, sai che il suo valore sarà il precedente, dunque il valore del delimitatore 8 sarà 4. Ti basterà prendere la chiave precedente a quella del delimitatore e otterrai il valore che cercavi.
    Adesso al volo mi viene da pensare che potresti farlo con una funzione SWITCH, ma non c'ho pensato molto

    A presto
    Evil

  4. #4
    Originariamente inviato da Santino83_02
    Utilita pratica di questa discussione? Risolvere un esercizietto? Se non riesci a pensarlo direttamete in php, scrivi a parole quello che dovrebbe fare l'algoritmo per risolvere il problema e poi traducilo in php
    Non è un esercizietto, ma una funzione che mi serve per sviluppare un CMS.
    Provo a scrivere in pseudo codice quello che dovrebbe fare la funzione
    Codice PHP:
    function fun ($delimitatore,$str){
    $delimitatori prendo_i_delimitatori_da_qualche_parte_che_so_io();
    if(
    $delimitatore appartiene ai $delimitatori) return $valore_del_delimitatore;

    Originariamente inviato da Santino83_02
    La butto così, anche se non c'ho capito molto. Se fai un explode con l'esempio che hai riportato, dopo ti ritroverai una situazione del genere:

    $var[0] // =1
    $var[1] // =3
    $var[2] // =6
    $var[3] // =4
    $var[4] // =8

    Dunque, se conosci il delimitatore, sai che il suo valore sarà il precedente, dunque il valore del delimitatore 8 sarà 4. Ti basterà prendere la chiave precedente a quella del delimitatore e otterrai il valore che cercavi.
    Adesso al volo mi viene da pensare che potresti farlo con una funzione SWITCH, ma non c'ho pensato molto

    A presto
    Evil
    La funzione explode, è quella giusta da utilizzare, ma in che modo?
    vi ricordo che in realtà i numeri sono messi solo per semplificare la stringa, ma nell'esempio reale, un possibile value potrebbe essere anche "questo è un value", quindi cosa inseriamo nell'explode?
    In realtà avevo pensato di fare all'inzio un explode, con il delimitatore a cui appartiene il value da prendere, e poi fare tanti altri explode, per quanti sono gli altri delimitatori, cosi ad arrivare ad avere una stringa pulita da tutti gli altri delimitatori, e quindi contenente solo il nostro value, ma sinceramente, traducendolo in php non ci sono riuscito..

  5. #5
    Ma una soluzione migliore di un testo concatenato a cacchio no? Cosa dovrebbe rappresentare nel tuo cms questa stringa?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    E poi questi delimitatori avranno una sintassi comune no? Nell'altro post li delimitavi cin [], qui? Numeri casuali? Ma che sono delimitatori quelli? L'idea dell'espressione regolare dell'altro post è migliore, basta casomai raffinarla un po
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    sto riscrivendo una nuova versione del mio CMS flat (uso di file invece del database), e affiancato al CMS dovrà uscire un progetto che richiama le linee die SQLite, ovvero utilizzare la stessa sintassi di MySQL per poter scrivere nei file.
    In questo caso il delimitatore, sarebbe la fine di ogni tabella, e il suo valore, sarebbe una stringa che rappresenta i vari valori nelle varie colonne.
    quindi nel caso reale di applicazione:
    $str = " ... ".alg("[/T=var]")." ... ".alg("[/T=var1]")." ... ".alg("[/T=var2]")." ... ".alg("[/T=var3]")." ".alg("[/T=var4]");
    dove alg restituisce un numero.
    Perchè non inserire un'altro delmitatore (magari a destra e sinistra del value?), semplicemente per non aumentare la lunghezza del file da leggere.
    Perchè utilizzare alg? perchè alg è una funzione che genera un hash insieme ad un salt, generato alla prima installazione, e quindi è come se fosse protetto da una possibile Injection, in quanto se l'utente avrebbe saputo il nome della tabella avrebbe potuto mandare in panne lo script.
    Per essere ancora più chiaro su come funziona lo script:
    questa dovrebbe essere la sintassi di un file tipo del DATABASE
    codice:
    name1: |||||||| name=0,surname=1,age=2 ||||||||
    name2: |||||||| name=0,surname=1,age=2 ||||||||
    
    /*--*/
    
    asd[/F]asd[/F]asd[/F][/R]
    asd[/F]asd[/F]asd[/F][/R]
    asd[/F]asd[/F]asd[/F][/R]
    [/T=name1]
    asd[/F]asd[/F]asd[/F][/R]
    asd[/F]asd[/F]asd[/F][/R]
    asd[/F]asd[/F]asd[/F][/R]
    [/T=name2]
    name1 e name2 sono ovviamente i nomi di due tabelle strutturate allo stesso modo.
    prima di " /*--*/ " ci sono due righe che mi restituiscono gli id delle colonne con i rispettivi nomi appartenenti a tale tabella
    dopo il " /*--*/ " c'è il database vero. [/F] indica la fine di un campo, [/R] la fine di una riga
    [/T=name1] la fine di una tabella
    Ovviamente, il file sarà da pensare come scritto su unica riga, perchè la riga è vista in termini di byte come un carattere, e quindi potrebbe ancora appesantire di più
    I delimitatori speciali come "|||||||| [/F] [/R] [/T=*]" sono tutti da pensare come hash, per come già detto sopra scongiurare eventuali Injection.
    Dopo aver scritto tutto questo papiello, non mi dire di lasciar perdere e di passare a MySQL thx

  8. #8
    io non ho capito niente dagli ultimi post, ma anche io userei l'explode e l'array.. non c'entrano i numeri o i caratteri perché le chiavi sono assegnate automaticamente e progressivamente quindi sono solo numeri

    e comunque, per semplificare io userei un solo delimitatore sempre uguale così non ti complichi la vita

  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Sull'altro post ho proposto delle soluzioni tra cui di aggiungere un paio di caratteri che consentirebbero di utilizzare le espressioni regolari ma non va. Prende troppo spazio. Ad un certo momento bisogna scegliere tra spazio e complessità quindi velocità.
    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

  10. #10

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 © 2025 vBulletin Solutions, Inc. All rights reserved.