[PHP] RISOLTO -Recupare valore data che soddisfa certi requisiti da array

Discussione in 'PHP' iniziata da coccobil, 22 Ottobre 2016.

Tag (etichette):
  1. coccobil

    coccobil Utente Attivo

    Registrato:
    28 Ottobre 2005
    Messaggi:
    36
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Ciao ragazzi,
    mi chiedevo se qualcuno gentilmente mi potrebbe dare una mano a risolvere un problema che mi sta mettendo in difficoltà.
    Diciamo che ho in input un array che contiene coppie di valori data-componenti come questo:

    Array ( [2015-07-25] => Un componente [2014-12-31] => Due componenti ...... )

    Io devo scegliere un valore secondo questo schema:
    1) Se l'anno della data di ultima registrazione (la prima coppia di valori nell' array) è minore dell'anno in corso prendo quello stesso valore (cioè mi va bene quella coppia di valori).
    2) Se l'anno della data di ultima registrazione (la prima coppia di valori nell' array) è uguale all'anno in corso devo prendere il primo valore disponibile dell'anno/i precedente/i (quello cioè più vicino al 1 gennaio dell'anno in corso).
    3) Se non esistono date dell'anno/i precedente/i devo prendere il primo valore disponibile dell'anno in corso, cioè quello più vicino al 1 gennaio.

    Come potrei impostare una routine che mi estragga questo valore?

    Grazie infinite per qualunque suggerimento.

    Massimo
     
  2. coccobil

    coccobil Utente Attivo

    Registrato:
    28 Ottobre 2005
    Messaggi:
    36
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Intanto grazie AdeKnite per la tua risposta.
    Si, devo prendere solo un valore. Ti dico da cosa nasce tutto il problema.
    Sto realizzando un gestionale per una pubblica amministrazione dove un calcolo di un'imposta dipende dal numero di componenti di un nucleo familiare al 1 gennaio di ogni anno. Ovviamente registrazioni al 1 gennaio non ne esistono quindi bisognerà prendere l'ultima data disponibile dell'anno precedente e se anche esistono registrazioni nell'anno in corso andranno ignorate in quanto al primo gennaio i componenti erano quelli dell'anno precedente. Nel caso invece si tratti di un nuovo nucleo familiare censito non esisteranno valori di anni precedenti ed in questo caso andrà presa la prima iscrizione quindi la prima registrazione dell'anno in corso, mi rendo conto che è un po' contorto ma purtroppo la delibera chiede questo :)
    Faccio un esempio pratico:
    il signor Mario Rossi ha questo storico componenti :

    31-12-2014 --> Due componenti
    25-07-2015 --> Un componente

    Caso 1, nessuna registrazione nell'anno in corso, prendo il valore 25-07-2015 --> Un componente
    Caso 2, il signor Mario Rossi modifica il numero dei componenti familiari il 07/6/2016 , m'interesserà sempre il valore del 25-07-2015 in quanto al 1 gennaio 2016 il numero di componenti non era ancora stato variato.
    Caso 3, il signor Rossi è un nuovo iscritto e quindi nel 2015 non aveva registrazioni. Si iscrive il 4-03-2016. In questo caso al 1 gennaio il numero componenti è zero ma da regolamento in questo caso prenderò il valore al 4 marzo.

    Spero di aver chiarito un po' la natura del problema.

    Grazie mille.

    Massimo
     
  3. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    Prova questo codice, mi sembra che funzioni.

    Se hai difficoltà a interpretare o qualsiasi altro tipo di dubbio o perplessità, chiedi pure.
    PHP:
    <?php

    function correggiFormato($data) {
        return 
    strlen($data) == substr($data,0,8)."0".substr($data,8,2) : $data;
    }



    /* INPUT:
    // $vettore = vettore che ha come chiavi delle date nel formato "Y-m-j"
    // $tipo_data = può assumere valore "maggiore", "minore" o "inizioAnno"
    // ritorna un array composto da due elementi: la data(maggiore o minore) e il valore associato a tale data nell'array di input

    */
    function qualeData($vettore,$tipo_data) { // sceglie un particolare tipo di data dato un vettore

        
    switch ($tipo_data) {
            case 
    'maggiore'// sceglie la data maggiore
                
    $max 0;
                foreach (
    $vettore as $key => $value) {
                    
    $data strtotime($key);
                    if (
    $data $max) {
                        
    $max $data;
                    }
                }

                
    $massimo correggiFormato(date("Y-m-j",$max));
                
    $valore $vettore[$massimo];
                
    $result = array($massimo,$valore);
                break;
          
            case 
    'minore'// sceglie la data minore
                
    $min strtotime("now");
                foreach (
    $vettore as $key => $value) {
                    
    $data strtotime($key);
                    if (
    $data $min) {
                        
    $min $data;
                    }
                }

                
    $minimo correggiFormato(date("Y-m-j",$min));
                
    $valore $vettore[$minimo];
                
    $result = array($minimo,$valore);
                break;

            case 
    "inizioAnno"//sceglie data più prossima al 01.01 dell'anno in corso
                // unix timestamp 01-01-2016
                
    $primo_giorno_anno_corrente strtotime(date("Y-01-01"));

                if (
    array_search(date("Y-01-01"), array_keys($vettore))) {
                    
    $result = array(date("Y-01-01"),$vettore[date("Y-01-01")]);
                } else {
                    
    $min 0;

                    foreach (
    $vettore as $key => $value) {
                        
    $data strtotime($key);

                        if(
    $data $primo_giorno_anno_corrente && $data $min) {
                            
    $min $data;
                        }
                    }

                    
    $minimo correggiFormato(date("Y-m-j",$min));
                    
    $valore $vettore[$minimo];
                    
    $result = array($minimo,$valore);
                  
                }
              
                break;
        }

        return 
    $result;
    }




    function 
    pickDate($storico) {

        
    $anno_corrente intval(date("Y")); // 2016

        
    foreach (array_keys($storico) as $key => $value) { // elenco_anni = array con gli anni
            
    $elenco_anni[$key] = intval(substr($value,0,4));
        }

        
    $i 0;
        foreach (
    $elenco_anni as $anno) {
            if (
    $anno == $anno_corrente) {
                
    $i++;
            }
        }

        
    /*

        $i == 0 => NON CI SONO REGISTRAZIONI NELL'ANNO IN CORSO

        0 < $i < count($elenco_anni) => CI SONO REGISTRAZIONI SIA DI QUEST'ANNO SIA DI ANNI PRECEDENTI

        $i == count($elenco_anni) => CI SONO SOLO REGISTRAZIONI DELL'ANNO CORRENTE

        */

        
    $no_reg_anno_in_corso FALSE;
        
    $no_reg_anni_passati FALSE;

        if (
    $i == 0) {
            
    $no_reg_anno_in_corso TRUE;
        } elseif (
    $i == count($elenco_anni)) {
            
    $no_reg_anni_passati TRUE;
        }

        if(
    $no_reg_anni_passati) {
            
    // prendo la data più piccola
            
    echo "Ci sono solo registrazioni per l'anno corrente";
            
    $data_estratta qualeData($storico,"minore");
        } elseif (
    $no_reg_anno_in_corso) {
            
    // prendo la data più grande
            
    echo "Non ci sono registrazioni per l'anno in corso.";
            
    $data_estratta qualeData($storico,"maggiore");
        } elseif (!
    $no_reg_anni_passati && !$no_reg_anno_in_corso) {
            
    // prendo il valore massimo <= al 1.1.annoincorso
            
    echo "Ci sono registrazioni sia per quest'anno sia per anni passati.";
            
    $data_estratta qualeData($storico,"inizioAnno");

        }
        return 
    $data_estratta;
    }



    //-------------VETTORE CON DATE E NUMERO COMPONENTI----------------

    // modifica le date a tuo piacimento per vedere se funziona tutto a dovere

    $storico['2015-07-25'] = "1";
    $storico['2015-01-02'] = "2";
    $storico['2016-01-01'] = "4";
    $storico['2015-08-02'] = "2";
    $storico['2015-01-02'] = "6";

    //-----------------------------------------------------------------



    $picked pickDate($storico);

    $data $picked[0];
    $numero_componenti $picked[1];

    echo 
    "<br><br><strong>Data: </strong>".$data."<br><strong>Numero componenti: </strong>".$numero_componenti;




    ?>
     
    A coccobil piace questo elemento.
  4. coccobil

    coccobil Utente Attivo

    Registrato:
    28 Ottobre 2005
    Messaggi:
    36
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    :eek: Sono basito! Ho solo fatto qualche prova vinto dalla curiosità ma mi pare che tutto funzioni alla perfezione! Ed in poche ore ... Che dire ... non ho parole per ringraziarti ed esprimerti la mia gratitudine. Sei bravissimo.
    Nel caso mi perda mi permetterò di ridisturbarti. Domattina faccio ancora due prove e cerco d'integrare tutto nel software.
    Grazie ancora!
    Massimo
     
Sto caricando...

Condividi questa Pagina