Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [PHP] Tagliare stringa da dx verso sx fino al primo spazio

    Buon giorno,
    Qualcuno sà come far tagliare una stringa da destra verso sinistra fino al primo spazio,

    esempio:
    "Seattle Sonics" diventa "Sonics"



    Grazie mille
    LoginDOT.com || Directory gratuita
    Aggiungete i vostri siti gratuitamente, back link non necessario, ma gradito.

  2. #2
    Ciao,
    se quello fosse l'esempio ti direi di utilizzare explode (la funzione più rapida) e prendere l'ultimo elemento dell'array
    per favore NIENTE PVT TECNICI da sconosciuti

  3. #3
    Originariamente inviato da Fabio Heller
    Ciao,
    se quello fosse l'esempio ti direi di utilizzare explode (la funzione più rapida) e prendere l'ultimo elemento dell'array
    Cacchio hai ragione... mi ero fissato con il visualbasic e non ho pensato all'explode del PHP.... grazie mille
    LoginDOT.com || Directory gratuita
    Aggiungete i vostri siti gratuitamente, back link non necessario, ma gradito.

  4. #4
    mmm xo se è un'operazione che devi eseguire TANTE volte...

    codice:
    $sottostringa = substr($stringa, 0, strpos($stringa, ' ')-1);
    +/- è questa la riga
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  5. #5
    explode, da benchmark fatti a suo tempo, è più performante di qualsiasi altra funzione per le stringhe
    per favore NIENTE PVT TECNICI da sconosciuti

  6. #6
    Originariamente inviato da Fabio Heller
    explode, da benchmark fatti a suo tempo, è più performante di qualsiasi altra funzione per le stringhe
    :master: :master: :master:

    lo so che stiamo andando ot con il thread ma come è possibile che se esplodo una stringa o lancio un substr è + veloce l'esplode del substr? :master:
    forse è dovuto al fatto che php deve interpretare 2 operazioni invece di una, non ci trovo altra motivazione
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #7
    Originariamente inviato da daniele_dll
    :master: :master: :master:

    lo so che stiamo andando ot con il thread ma come è possibile che se esplodo una stringa o lancio un substr è + veloce l'esplode del substr? :master:
    forse è dovuto al fatto che php deve interpretare 2 operazioni invece di una, non ci trovo altra motivazione
    La ragione principale è sicuramente quella, devi chiamare due funzioni per fare una cosa che con explode fai in una.
    Inoltre mi dicono che substr, strstr etc. non sono particolarmente performanti di loro...tu che ogni tanto dai un'occhiata ai sorgenti C forse puoi capire perchè
    per favore NIENTE PVT TECNICI da sconosciuti

  8. #8
    Originariamente inviato da Fabio Heller
    La ragione principale è sicuramente quella, devi chiamare due funzioni per fare una cosa che con explode fai in una.
    Inoltre mi dicono che substr, strstr etc. non sono particolarmente performanti di loro...tu che ogni tanto dai un'occhiata ai sorgenti C forse puoi capire perchè
    lol ora guardo, xo c'ho i sorgenti del 5, ma non credo cambi molto
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  9. #9
    mmm

    credo che sia tutto dovuto proprio al fatto che php si trova costretto a richiamare + volte funzioni che richiama comunque lui stesso all'interno di explode

    codice:
    		found = php_memnstr(Z_STRVAL_PP(haystack) + offset,
    			                Z_STRVAL_PP(needle),
    			                Z_STRLEN_PP(needle),
    			                Z_STRVAL_PP(haystack) + Z_STRLEN_PP(haystack));
    non sono xo riuscito a trovare riferimento a questa funzione anche se dal nome e dai parametri si intuisce che cerca all'interno di una stringa per dei caratteri e restituisce la posizione della stringa
    anche xche poi
    codice:
    		RETURN_LONG(found - Z_STRVAL_PP(haystack));
    restituisce proprio quello che trova ^^

    mentre substr è abbastanza semplice...semplicemente estrae la sotto striga
    praticamente fa tutto qui...
    codice:
    RETURN_STRINGL(Z_STRVAL_PP(str) + f, l, 1);
    probabilmente è definita dentro lo zend engine

    mentre l'explode fa questo...
    codice:
    	p1 = Z_STRVAL_P(str);
    	p2 = php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);
    
    	if (p2 == NULL) {
    		add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1);
    	} else {
    		do {
    			add_next_index_stringl(return_value, p1, p2 - p1, 1);
    			p1 = p2 + Z_STRLEN_P(delim);
    		} while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL &&
    				 (limit == -1 || --limit > 1));
    
    		if (p1 <= endp)
    			add_next_index_stringl(return_value, p1, endp-p1, 1);
    	}
    in pratica in p1 inserisce un puntatore alla memoria dove lo zend engine tiene la variabile, mentre in p2 ritorna la posizione del carattere richiesto dentro la stringa
    tanto che dopo fa un if per vedere se p2 è vuoto è usa
    codice:
    		add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1);
    la funzione add_next_index_stringl (che credo il nome dica tutto) per aggiugnere al valore di ritorno tutta la riga intera
    altrimenti

    codice:
    		do {
    			add_next_index_stringl(return_value, p1, p2 - p1, 1);
    			p1 = p2 + Z_STRLEN_P(delim);
    		} while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL &&
    				 (limit == -1 || --limit > 1));
    
    		if (p1 <= endp)
    			add_next_index_stringl(return_value, p1, endp-p1, 1);
    usando un do while inserisce nell'array la prima posizione interessata e per farlo passa come 3 parametro la sottrazione tra i due puntatori, (dato che sono numerici e si riferiscono tutti e due alla stessa stringa e p2 è la posizione trovata) e poi sposta la posizione nella memoria relativa a p1 di p2 + la lunghezza del delimitatore

    e lancia il while

    ora qui mi fermo xche già mi sono perso abbastanza
    cmq...si...decisamente usando quelle due distinte funzioni php deve fare parecchio lavoro in +
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  10. #10
    Perchè non postare anche un po' di codice assembly dell'ultima versione del kernel, già che ci siamo ? :rollo:

    Qui si va oltre il concetto di Off Topic, e non serve di certo un moderatore rompiscatole per capirlo

    Visto che Andreace86 ha risolto il problema chiudo il thread, per evitare tentazioni di continuare la discussione
    Addio Aldo, amico mio... [03/12/70 - 16/08/03]

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.