Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    ::1
    il 2014-09-11 00:54:13.0 alle 2014-09-11 00:54:13.0
    Trollate totali: 12321
    php: wtf #5345653464
    Ordinare un array mischiato non produce sempre lo stesso risultato: http://3v4l.org/1LfLW
    Young professional woman and busy mom.
    • Avatar
      Scritto da
      Non Autenticato
      il 2014-09-11 01:25:16.0 alle 2014-09-11 01:25:16.0
      Re: php: wtf #5345653464
      Scritto da: ::1
      > Ordinare un array mischiato non produce sempre lo stesso risultato: http://3v4l.org/1LfLW

      Ranona
      • Avatar
        ☺
        Scritto da
        ::1
        il 2014-09-11 09:07:16.0 alle 2014-09-11 09:07:16.0
        Trollate totali: 12321
        Re: php: wtf #5345653464
        Scritto da:
        >
        > Ranona

        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.
        • Avatar
          Scritto da
          Non Autenticato
          il 2014-09-11 14:45:11.0 alle 2014-09-11 14:45:11.0
          Re: php: wtf #5345653464
          Scritto da: ::1
          > Scritto da:
          > >
          > > Ranona
          >
          > 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.
          • Avatar
            ☺
            Scritto da
            ::1
            il 2014-09-11 14:53:42.0 alle 2014-09-11 14:53:42.0
            Trollate totali: 12321
            Re: php: wtf #5345653464
            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.
            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.
            • Avatar
              Scritto da
              Non Autenticato
              il 2014-09-11 14:59:49.0 alle 2014-09-11 14:59:49.0
              Re: php: wtf #5345653464
              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" Sorpresa

              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!!!
              • Avatar
                Scritto da
                Non Autenticato
                il 2014-09-11 15:01:40.0 alle 2014-09-11 15:01:40.0
                Re: php: wtf #5345653464
                Scritto 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" Sorpresa
                >
                > 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?
                • Avatar
                  ☺
                  Scritto da
                  ::1
                  il 2014-09-11 15:05:09.0 alle 2014-09-11 15:05:09.0
                  Trollate totali: 12321
                  Re: php: wtf #5345653464
                  Scritto da:
                  >
                  > Se li delimito con apici semplici succede la stessa cosa?

                  Sì http://3v4l.org/lf3uX
                  Young professional woman and busy mom.
                  • Avatar
                    Scritto da
                    Non Autenticato
                    il 2014-09-11 15:51:46.0 alle 2014-09-11 15:51:46.0
                    Re: php: wtf #5345653464
                    Scritto 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.
                    • Avatar
                      ☺
                      Scritto da
                      ::1
                      il 2014-09-11 16:01:57.0 alle 2014-09-11 16:01:57.0
                      Trollate totali: 12321
                      Re: php: wtf #5345653464
                      Scritto 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.
                      • Avatar
                        Scritto da
                        Non Autenticato
                        il 2014-09-11 18:47:05.0 alle 2014-09-11 18:47:05.0
                        Re: php: wtf #5345653464
                        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.
                        • Avatar
                          ☺
                          Scritto da
                          ::1
                          il 2014-09-11 19:32:56.0 alle 2014-09-11 19:32:56.0
                          Trollate totali: 12321
                          Re: php: wtf #5345653464
                          Scritto 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.
                        • Avatar
                          Scritto da
                          Non Autenticato
                          il 2014-09-11 20:02:17.0 alle 2014-09-11 20:02:17.0
                          Re: php: wtf #5345653464
                          Scritto 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 Ficoso
<softv>

Pagina generata in 118 millisecondi

Utenti attivi: 11 nell'ultimo minuto, 20 negli ultimi cinque minuti, 46 negli ultimi 15 minuti