Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,574

    Trovare valori unici in un array.

    Ciao, come da titolo devo trovare dei valori in un array.
    So che esiste la funzione PHP array_unique() ma in questo caso non mi funziona.

    Vi spiego il problema.

    Ho un database con registrati dei dati anno per anno, costituente un archivio diviso per annate, e devo costruire un menù che suddivide le viste di ogni anno, tramite una dropbox.

    Tralasciando la dropbox, cosa semplice, il problema è nello scremare gli anni dei vari "archivi".

    Per tirare fuori i dati faccio una query in cui tiro fuori il solo campo anno_reg che corrisponde appunto all'anno di registrazione.
    SELECT anno_reg FROM archivio WHERE annullato = 0 ORDER BY anno_reg DESC;
    Ora quel campo esiste in ogni record, così mi trovo ad esempio per l'anno 2020 3566 record in cui ci sono appunto 3566 record in un campo anno_reg con dentro il valore 2020 e 1 anno_reg con dentro 2021 ( registrato per prova ).
    1. ['anno_reg'] = 2021
    2. ['anno_reg'] = 2020
    3. ['anno_reg'] = 2020
    4. ['anno_reg'] = 2020
    5. ['anno_reg'] = 2020
    6. etc.
    Bene, se do array_unique() al risultato, mi riduce tutto al solo valore 2021, cancellando l'intero anno scorso, ma a me serve proprio conoscere i numeri di anni presenti, non l'ultimo registrato ( avrei fatta una altro tipo di query ), per ciclare e il risultato e generare la dropbox.

    Le cose a cui sto pensando sono: un array_walk() sul risultato, con una funzione di callback che mi tolga tutti i valori di anni uguali, tranne uno, oppure una query SQL che mi faccia la stessa cosa, ma non so al momento come farla.

    So che è inizio anno, e molti sono confusi almeno quanto me al momento, ma riuscite a darmi una mano?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,574
    EDIT: per ora ho risolto con una funziona di callback, ma è lenta.

    Codice PHP:
    if ( $annate ) {
        
    $anni = [];
        
    array_walk_recursive$annate, function($valore) use (&$anni) {
                if (
    in_array($valore$anni) === false$anni[] = $valore;
        });
        
    $listaAnni '';
        foreach( 
    $anni as $anno )
            
    $listaAnni .= "<li><a href=\"registri.php?viz=1&reg=leg&anno=$anno\">Anno $anno</a></li>\n";

    Dove:
    • $annate è l'array che contiene gli anni così come risultano dopo la query;
    • $anni è un array di comodo in cui finiranno gli anni "validi";
    • nella funzione, se il valore passato al momento non esiste dentro l'array $anni, vi viene aggiunto;
    • $listaAnni è la lista per il menù;
    • compila la lista per la dropbox ciclando all'array $anni.


    Problemi? Sì, uno solo, è lenta perché deve ciclare l'intero archivio di anni contenuto in $annate.
    Per ora c'è solo il 2020 con già 3566 valori, il 2021 solo uno creato per le prove, ma a fine anno si prevede un numero molto alto, e se è già lento così, è chiaro che il tutto è solo un ripiego.

    La vera soluzione deve venire dall'SQL ma per ora non so che query invocare.

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,574
    Va bene, RISOLTO.


    Bastava dare un DISTINCT nella query.
    SELECT DISTINCT anno_reg FROM archivio WHERE annullato = 0 ORDER BY anno_reg DESC;
    Non è velocissimo, ma pure la rete dove lavoro non è un fulmine di guerra ed io devo dormire la notte.

  4. #4
    Aggiungi un indice sul campo che usi per fare il distinct e su eventuali altri campi usati per i filtri.

  5. #5
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,574
    @filippo.toso è un'idea, ma mi pare pesante aggiungere un indice ad un campo, per velocizzare quell'azione, non vorrei che diventi lento a prescindere dai tentati miglioramenti, comunque provo.

    EDIT: Bo!
    Sembra più veloce, ma per ora i record sono pochi, e la rete a quest'ora va veloce, la modifica se funziona la vedrò più tardi, quando il carico sarà pesante.
    Ultima modifica di Marcolino's; 07-01-2021 a 08:25

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 © 2021 vBulletin Solutions, Inc. All rights reserved.