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 +