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

coccobil

Utente Attivo
28 Ott 2005
36
0
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
 

coccobil

Utente Attivo
28 Ott 2005
36
0
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
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
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) == 9 ? 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;




?>
 
  • Like
Reactions: coccobil

coccobil

Utente Attivo
28 Ott 2005
36
0
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