Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Moderatrice di CSS L'avatar di ResianTaxidrive
    Registrato dal
    Oct 2007
    residenza
    Udine
    Messaggi
    2,766

    Problema ordinamento array

    Ciao,
    ho un problema ad ordinare in base a un certo field un array con più fields. IN particolare vorrei ordinare l'array (mantenendo l'associazione key - value) in base al field "data". Vi posto il mio codice, non funziona, non ordina l'array.
    Il procedimento che io faccio è:
    1) inserisco via pannello di controllo un item (tramite POST)
    2) leggo la lista di tutti gli item(file json)
    3) aggiungo l'item che ho aggiunto alla lista
    4) ordino la lista.
    5) scrivo il json.

    Orbene il tutto non funziona e non capisco perchè:
    codice:
    //array di oggetti
    $eventi=json_decode($string);
    
    
    $data = $_POST['data'];
    $titolo = $_POST['titolo'];
    $testobreve = $_POST['testobreve'];
    
    $data= strtotime($data);
    
    $array = array(
        "data" => $data,
        "titolo" => $titolo,
        "testobreve" => $testobreve
    );
    
    //inserimento nuovo oggetto
    array_unshift($eventi, $array);
    
    function obj_sort_asc($a, $B)/>/>
    {
    	return $a->data - $b->data;
    }
    
    function obj_sort_desc($a, $B)/>/>
    {
    	return $b->data - $a->data;
    }
    
    //ordinamento array
    usort($eventi,"obj_sort_desc");
    
    //scrivo file
    $encoded=json_encode($eventi);
    file_put_contents('eventi.json', $encoded);

  2. #2
    Nelle function devi mettere la b minuscola. PHP è case sensitive!

    Codice PHP:
    ...
    function 
    obj_sort_asc($a$B)
    ...
    function 
    obj_sort_desc($a$B)
    ... 

    Codice PHP:
    ...
    function 
    obj_sort_asc($a$b)
    ...
    function 
    obj_sort_desc($a$b)
    ... 
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Moderatrice di CSS L'avatar di ResianTaxidrive
    Registrato dal
    Oct 2007
    residenza
    Udine
    Messaggi
    2,766
    scusami, non so per quale motivo mi si è maiuscolizzata la $B, facendo copia/incolla per togliere i pezzi di codice che non centravano, la $b mi è misteriosamente diventata maiuscola ma nel mio codice originale è minuscola. Sono tutte minuscole.
    Confermo che con tutte minuscole non funziona.

  4. #4
    Sei sicura che $eventi sia un array? Prova a stamparlo con print_r($eventi); Inoltre, nelle funzioni, fai un echo di $a->data e $b->data in modo da verificarne il contenuto.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Moderatrice di CSS L'avatar di ResianTaxidrive
    Registrato dal
    Oct 2007
    residenza
    Udine
    Messaggi
    2,766
    Effettivamente c'è qualcosa di strano. Provando a stampare $eventi (copio un pezzo) viene fuori:

    codice:
    Array ( [0] => Array ( [data] => 1374876000 [titolo] => prova di oggi [testobreve] => [testolungo] => [immagine] => ../immagini/ [allegato] => ../allegati/ ) [1] => stdClass Object ( [data] => 1376604000 [titolo] => agosto [testobreve] => [testolungo] => [immagine] => ../immagini/ [allegato] => ../allegati/ ) [2] => stdClass Object ( [data] => 1375394400 [titolo]
    Perchè "stdClass Object" ?

    INoltre provando a stampare
    $a->data e $b->data viene tipo:
    codice:
    b 1406239200
    a 1374703200
    b 1376604000
    a 1374703200
    Però mi da un warning:
    Notice: Trying to get property of non-object in nomefile on line 90 e nelle altre righe dove ci si riferisce a $a->data e $b->data

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Secondo me dipende da fatto che json_decode ti crea un array di stdClass (dove puoi usare ->) , ma tu invece poi ti crei un array con i nuovi dati (con array non puoi usare la -> )

    Quindi prova a crearti una classe stdClass invece dell'array:

    Codice PHP:
    ...

    $obj = new stdClass();
    $obj->data $data;
    $obj->titolo $titolo;
    $obj->testobreve $testobreve;

    array_unshift($eventi$obj);

    ... 
    Oppure, puoi passare true a json_decode (json_decode($string, true)) ed avere un array di array. Chiaramente nella tua funzione di confronto dovrai usare le [] es: return $a['data'] - $b['data'];

  7. #7
    Moderatrice di CSS L'avatar di ResianTaxidrive
    Registrato dal
    Oct 2007
    residenza
    Udine
    Messaggi
    2,766
    Scusate la risposta così tardiva.
    Ho messo il true al json_decode e ha funzionato.
    ...
    e dire che inizialmente quel true lo avevo messo...per poi rimuoverlo per un motivo non ben precisato.
    L'ordinamento avviene ora in maniera del tutto corretta.
    Grazie per l'aiuto.

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.