-
php: wtf #5345653464Ordinare un array mischiato non produce sempre lo stesso risultato: http://3v4l.org/1LfLW
Young professional woman and busy mom.-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 01:25:16.0 alle 2014-09-11 01:25:16.0Scritto da: ::1
> Ordinare un array mischiato non produce sempre lo stesso risultato: http://3v4l.org/1LfLW
-
Re: php: wtf #5345653464Scritto da:
>
>
In qualunque linguaggio, ordinando gli elementi di una lista ottengo sempre lo stesso output, qualunque sia l'ordine degli elementi in input.
In php no.
L'equivalente javascript, per fare un esempio:console.log(["123", "456A", "78"].sort()) console.log(["456A", "78", "123"].sort()) console.log(["78", "123", "456A"].sort()) console.log(["78", "456A", "123"].sort())
Produce:Array [ "123", "456A", "78" ] Array [ "123", "456A", "78" ] Array [ "123", "456A", "78" ] Array [ "123", "456A", "78" ]
Young professional woman and busy mom.-
Re: php: wtf #5345653464Scritto da: ::1
> >
>
> In qualunque linguaggio
PHP non e' qualunque linguaggio, bamba dell'ostia.
- Licchione -`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 14:45:11.0 alle 2014-09-11 14:45:11.0Scritto da: ::1
> Scritto da:
> >
> >
>
> In qualunque linguaggio, ordinando gli elementi di una lista ottengo sempre lo stesso output, qualunque sia l'ordine degli elementi in input.
> In php no.
>
> L'equivalente javascript, per fare un esempio:
>console.log(["123", "456A", "78"].sort()) > console.log(["456A", "78", "123"].sort()) > console.log(["78", "123", "456A"].sort()) > console.log(["78", "456A", "123"].sort())
> Produce:
>Array [ "123", "456A", "78" ] > Array [ "123", "456A", "78" ] > Array [ "123", "456A", "78" ] > Array [ "123", "456A", "78" ]
Ho capito il problema, ma non capisco la logica per cui PHP li ordini in altro modo. Può essere per la presenza della "A" ma non capisco comunque perché, dato che sono comunque tutte stringhe.
Dev'esserci sotto qualche trucco come nella domanda dell'asino e carretto.-
Re: php: wtf #5345653464Scritto da:
>
> Ho capito il problema, ma non capisco la logica per cui PHP li ordini in altro modo. Può essere per la presenza della "A" ma non capisco comunque perché, dato che sono comunque tutte stringhe.
> Dev'esserci sotto qualche trucco come nella domanda dell'asino e carretto.
Al di là del motivo per cui hai quel risultato, la parte peggiore è che versioni diverse di php danno output diversi per una operazione che dovrebbe avere solo un risultato: un algoritmo che è sbagliato in modi diversi a seconda della versione.
Comunque il codice l'ho preso qua, spiega anche perché:https://www.reddit.com/r/lolphp/comments/2fxgu7/th...

tl;dr: "123" < "456A" and "456A" < "78", but "78" < "123". (secondo commento)Young professional woman and busy mom.-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 14:59:49.0 alle 2014-09-11 14:59:49.0Scritto da: ::1
> Scritto da:
> >
> > Ho capito il problema, ma non capisco la logica per cui PHP li ordini in altro modo. Può essere per la presenza della "A" ma non capisco comunque perché, dato che sono comunque tutte stringhe.
> > Dev'esserci sotto qualche trucco come nella domanda dell'asino e carretto.
>
> Al di là del motivo per cui hai quel risultato, la parte peggiore è che versioni diverse di php danno output diversi per una operazione che dovrebbe avere solo un risultato: un algoritmo che è sbagliato in modi diversi a seconda della versione.
Il che è una bella rogna, ad esempio sapevo che per PHP lo zero, la stringa vuota e false sono la stessa cosa, ma non mi aspettavo questo pasticcio negli ordinamenti.
> Comunque il codice l'ho preso qua, spiega anche perché:
>https://www.reddit.com/r/lolphp/comments/2fxgu7/th...

> tl;dr: "123" < "456A" and "456A" < "78", but "78" < "123". (secondo commento)
"78" < "123"
Ma se sono stringhe! hanno le virgolette!
E perché allora "456A" < "78"? La presenza della "A" li fa valutare come stringhe mentre nell'altro caso li valuta come numeri?
LICH SUL BANCO DEGLI IMPUTATI!!!-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 15:01:40.0 alle 2014-09-11 15:01:40.0Scritto da:
> Scritto da: ::1
> > Scritto da:
> > >
> > > Ho capito il problema, ma non capisco la logica per cui PHP li ordini in altro modo. Può essere per la presenza della "A" ma non capisco comunque perché, dato che sono comunque tutte stringhe.
> > > Dev'esserci sotto qualche trucco come nella domanda dell'asino e carretto.
> >
> > Al di là del motivo per cui hai quel risultato, la parte peggiore è che versioni diverse di php danno output diversi per una operazione che dovrebbe avere solo un risultato: un algoritmo che è sbagliato in modi diversi a seconda della versione.
>
> Il che è una bella rogna, ad esempio sapevo che per PHP lo zero, la stringa vuota e false sono la stessa cosa, ma non mi aspettavo questo pasticcio negli ordinamenti.
>
> > Comunque il codice l'ho preso qua, spiega anche perché:
> >https://www.reddit.com/r/lolphp/comments/2fxgu7/th...

> > tl;dr: "123" < "456A" and "456A" < "78", but "78" < "123". (secondo commento)
>
> "78" < "123"
>
> Ma se sono stringhe! hanno le virgolette!
>
> E perché allora "456A" < "78"? La presenza della "A" li fa valutare come stringhe mentre nell'altro caso li valuta come numeri?
>
> LICH SUL BANCO DEGLI IMPUTATI!!!
Se li delimito con apici semplici succede la stessa cosa?-
-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 15:51:46.0 alle 2014-09-11 15:51:46.0Scritto da: ::1
> Scritto da:
> >
> > Se li delimito con apici semplici succede la stessa cosa?
>
> Sì http://3v4l.org/lf3uX
Il problema è dovuto al fatto che PHP è un linguaggio dinamico e alcuni degli elementi dell'array vengono interpretati come numeri durante l'ordinamento mentre altri (quelli che contengono lettere) come stringhe.
Come dice la pagina di documentazione di PHP:
"Be careful when sorting arrays with mixed types values because sort() can produce unpredictable results"
Se vuoi essere sicuro che tutti gli elementi dell'array siano trattati come stringhe devi impostare il parametro opzionale SORT_STRING, non basta mettere i numeri fra apicetti:
sort($a, SORT_STRING);
Purtroppo nei linguaggi dinamici queste cose succedono per questo preferisco quelli tipizzati dove non esiste la possibilità di cadere in queste trappole poco intuitive e difficili da debuggare.-
Re: php: wtf #5345653464Scritto da:
>
> Il problema è dovuto al fatto che PHP è un linguaggio dinamico e alcuni degli elementi dell'array vengono interpretati come numeri durante l'ordinamento mentre altri (quelli che contengono lettere) come stringhe.
>
> Come dice la pagina di documentazione di PHP:
> "Be careful when sorting arrays with mixed types values because sort() can produce unpredictable results"
>
> Se vuoi essere sicuro che tutti gli elementi dell'array siano trattati come stringhe devi impostare il parametro opzionale SORT_STRING, non basta mettere i numeri fra apicetti:
>
> sort($a, SORT_STRING);
>
> Purtroppo nei linguaggi dinamici queste cose succedono per questo preferisco quelli tipizzati dove non esiste la possibilità di cadere in queste trappole poco intuitive e difficili da debuggare.
Javascript, ruby, python, perl sono linguaggi tipizzati dinamicamente, ma non hanno questo problema.Young professional woman and busy mom.-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 18:47:05.0 alle 2014-09-11 18:47:05.0Scritto da: ::1
> Javascript, ruby, python, perl sono linguaggi tipizzati dinamicamente, ma non hanno questo problema.
A me fanno cagare un po' tutti i linguaggi non tipizzati, ma se JS, ruby, python e perl non hanno questo particolare problema ne hanno almeno 100 altri, nel caso da te riportato non dipende nemmeno da PHP ma da come è implementata la funzione sort.
La mia ipotesi è che la funzione sort faccia un test sul dato per capire quale strategia di ordinamento utilizzare, tipo usi la funzione "is_numeric". is_numeric ritorna vero nel caso di '123' e falso nel caso di '123a' ed ecco spiegato l'arcano.
Quello che ne puoi dedurre è che la funzione sort poteva essere progettata meglio (tipo mettere obbligatorio il secondo parametro anziché opzionale) ma d'altro canto nella documentazione ci sta scritto di non mischiare tipi di dati diversi... il problema è che uno pensa che le cose scritte fra apici siano stringhe... mentre sort si basa (secondo la mia ipotesi) su is_numeric che serve proprio per stabilire se una stringa è o meno un numero.
Tieni conto che in PHP tutti i dati ritornati da una Form sono stringhe, quindi ha senso che sort usi is_numeric per stabilire se l'input è invece inteso come un numero o no... la documentazione potrebbe essere più chiara al riguardo, o meglio ancora potrebbero eliminare l'incertezza aggiustando la funzione sort per rendere obbligatorio il secondo parametro (ma questo probabilmente romperebbe tutti i siti che si basano su sort senza secondo parametro).
Purtroppo la libreria di PHP fa cagare se confrontata ad esempio con .NET o altre librerie di funzioni e classi tipo Java... si è sviluppata nel tempo in modo disomogeneo aggiungendo funzioni su funzioni senza un progetto chiaro e cercando di mantenere la retrocompatiblità il più possibile... questo ha portato al marasma odierno.
Il problema di PHP non è il linguaggio, ma la sua libreria, che fa cagare a spruzzo.
-
Re: php: wtf #5345653464Scritto da:
> Scritto da: ::1
> > Javascript, ruby, python, perl sono linguaggi tipizzati dinamicamente, ma non hanno questo problema.
>
> A me fanno cagare un po' tutti i linguaggi non tipizzati, ma se JS, ruby, python e perl non hanno questo particolare problema ne hanno almeno 100 altri, nel caso da te riportato non dipende nemmeno da PHP ma da come è implementata la funzione sort.
Mah, nel complesso ti assicuro che hanno molti meno problemi di php.
> La mia ipotesi è che la funzione sort faccia un test sul dato per capire quale strategia di ordinamento utilizzare, tipo usi la funzione "is_numeric". is_numeric ritorna vero nel caso di '123' e falso nel caso di '123a' ed ecco spiegato l'arcano.
>
> Quello che ne puoi dedurre è che la funzione sort poteva essere progettata meglio (tipo mettere obbligatorio il secondo parametro anziché opzionale) ma d'altro canto nella documentazione ci sta scritto di non mischiare tipi di dati diversi... il problema è che uno pensa che le cose scritte fra apici siano stringhe... mentre sort si basa (secondo la mia ipotesi) su is_numeric che serve proprio per stabilire se una stringa è o meno un numero.
>
> Tieni conto che in PHP tutti i dati ritornati da una Form sono stringhe, quindi ha senso che sort usi is_numeric per stabilire se l'input è invece inteso come un numero o no... la documentazione potrebbe essere più chiara al riguardo, o meglio ancora potrebbero eliminare l'incertezza aggiustando la funzione sort per rendere obbligatorio il secondo parametro (ma questo probabilmente romperebbe tutti i siti che si basano su sort senza secondo parametro).
>
> Purtroppo la libreria di PHP fa cagare se confrontata ad esempio con .NET o altre librerie di funzioni e classi tipo Java... si è sviluppata nel tempo in modo disomogeneo aggiungendo funzioni su funzioni senza un progetto chiaro e cercando di mantenere la retrocompatiblità il più possibile... questo ha portato al marasma odierno.
>
> Il problema di PHP non è il linguaggio, ma la sua libreria, che fa cagare a spruzzo.
>
Anche la mancanza di una grammatica formale e un parser pieno di errori ci mettono del proprio.Young professional woman and busy mom.-
Come mai oggi ci sono così pochi post?Scritto daNon Autenticatoil 2014-09-11 20:10:58.0 alle 2014-09-11 20:10:58.0Lich non si fa vedere per non dover difendere l'indifendibile?
-
Re: Come mai oggi ci sono così pochi post?Scritto daNon Autenticatoil 2014-09-11 20:36:40.0 alle 2014-09-11 20:36:40.0Scritto da:
> Lich non si fa vedere per non dover difendere l'indifendibile?
ha la vaginite
-
-
-
Re: php: wtf #5345653464Scritto daNon Autenticatoil 2014-09-11 20:02:17.0 alle 2014-09-11 20:02:17.0Scritto da:
> Scritto da: ::1
> > Javascript, ruby, python, perl sono linguaggi tipizzati dinamicamente, ma non hanno questo problema.
>
> A me fanno cagare un po' tutti i linguaggi non tipizzati, ma se JS, ruby, python e perl non hanno questo particolare problema ne hanno almeno 100 altri, nel caso da te riportato non dipende nemmeno da PHP ma da come è implementata la funzione sort.
>
> La mia ipotesi è che la funzione sort faccia un test sul dato per capire quale strategia di ordinamento utilizzare, tipo usi la funzione "is_numeric". is_numeric ritorna vero nel caso di '123' e falso nel caso di '123a' ed ecco spiegato l'arcano.
>
> Quello che ne puoi dedurre è che la funzione sort poteva essere progettata meglio (tipo mettere obbligatorio il secondo parametro anziché opzionale) ma d'altro canto nella documentazione ci sta scritto di non mischiare tipi di dati diversi... il problema è che uno pensa che le cose scritte fra apici siano stringhe... mentre sort si basa (secondo la mia ipotesi) su is_numeric che serve proprio per stabilire se una stringa è o meno un numero.
>
> Tieni conto che in PHP tutti i dati ritornati da una Form sono stringhe, quindi ha senso che sort usi is_numeric per stabilire se l'input è invece inteso come un numero o no... la documentazione potrebbe essere più chiara al riguardo, o meglio ancora potrebbero eliminare l'incertezza aggiustando la funzione sort per rendere obbligatorio il secondo parametro (ma questo probabilmente romperebbe tutti i siti che si basano su sort senza secondo parametro).
>
> Purtroppo la libreria di PHP fa cagare se confrontata ad esempio con .NET o altre librerie di funzioni e classi tipo Java... si è sviluppata nel tempo in modo disomogeneo aggiungendo funzioni su funzioni senza un progetto chiaro e cercando di mantenere la retrocompatiblità il più possibile... questo ha portato al marasma odierno.
>
> Il problema di PHP non è il linguaggio, ma la sua libreria, che fa cagare a spruzzo.
Hòla Wakko
-
-
-
-
-
-
-
-
-
-
-