[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
30
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
 
Discussioni simili
Autore Titolo Forum Risposte Data
C [RISOLTO]Inserimento variabile php in input html PHP 20
moustache [RISOLTO] SQL PHP IIS PHP 8
L update tabelle in php mysql [risolto] PHP 6
A [PHP] Problema query insert [RISOLTO] PHP 14
B [PHP] recuperare IP dei server in load balancing [RISOLTO] PHP 3
K [RISOLTO] Problema Griglia Php+Mysql PHP 13
C [RISOLTO][PHP] Errore di sintassi PHP 8
Kolop [RISOLTO][PHP] Problema Pagination PHP 2
C [RISOLTO][PHP] Funzione ONclick PHP 14
C [RISOLTO][PHP] Conteggio righe di una tabella PHP 4
N [PHP] Utilizzo variabili di sessione [Risolto] PHP 13
Tommy03 [RISOLTO][PHP] Webserver o devserver? PHP 2
spider81man [PHP] Problemi cancellazione dato su DB [RISOLTO] PHP 1
A [PHP] RISOLTO Invio Mail con Tabella PHP 2
elpirata [PHP][RISOLTO] Sommare gli importi estratti da un ciclo while PHP 3
elpirata [PHP][RISOLTO] Effettuare la somma dei tempi di lavorazione PHP 3
elpirata [PHP] [RISOLTO]Sovrascrivere testo in una tabella PHP 2
A [RISOLTO]Recuperare dati inviati con json tramite php PHP 4
C [RISOLTO][PHP] Passaggio variabili senza refresh di pagina PHP 7
elpirata [PHP][RISOLTO] Errore di tipo Notice: Undefined index - Come risolvere quando si hanno tante var PHP 10
S Problema in PHP per invio file XML - RISOLTO- PHP 8
A [RISOLTO] HighChart e PHP PHP 4
A [RISOLTO] PHP Selezionare tutti i file con stessa estensione PHP 2
A [RISOLTO] Table elaborata da codice PHP con dati da DB non visualizzata in IFRAME PHP 15
Zea [PHP] RISOLTO - creare link con il risultato dell'interrogazione db PHP 1
A [PHP] [RISOLTO]Compilazione campi form da record db PHP 3
A [PHP] [RISOLTO] Modifica record db da form PHP 11
G [PHP][RISOLTO] Include/Require non funzionante PHP 9
C [PHP] RISOLTO - Eliminare elementi duplicati da array multidimensionale PHP 1
G [RISOLTO][PHP] Call to a member function num_rows() on a non-object PHP 9
U [PHP - RISOLTO] Tabella dinamica: colonne selezionate da checkbox PHP 40
CristianB72 [RISOLTO] [PHP] Istruzione "if" non funziona PHP 6
fabryx [PHP] RISOLTO: Download file da web e trasferimento su server PHP 2
fabryx [PHP]RISOLTO: Parsing xml nodi con caratteri speciali PHP 1
CristianB72 [RISOLTO][PHP] preg_match di un array PHP 7
G [RISOLTO][PHP] Estrapolare dati da Tabella PHP 11
A [RISOLTO]Errore caricamento file php PHP 21
fabryx [PHP]RISOLTO: Trasformare righe in colonne assegnando singole variabili PHP 10
fabryx [PHP]RISOLTO: eliminazione riga con singolo valore duplicato in array PHP 19
elpirata [RISOLTO]Stampare giorno della settimana in tabella php PHP 6
elpirata [PHP] [RISOLTO] Stampare classe css in base al risultato della query PHP 6
elpirata [Risolto] Gestione Prenotazioni script php PHP 25
K [risolto] passaggio variabile a pagina php con ajax Ajax 6
J [risolto] Trasformare la seguente classe PHP PHP 2
E [risolto] win 8.1 + IE11 le sessioni PHP non fuonzionano correttamente PHP 7
N [RISOLTO] Mostrare a video le checkbox selezionate con PHP e MySQL PHP 4
otto9due [risolto] Problema sessioni php e login PHP 5
G [risolto] Creazione file excel con PHP PHP 3
S [risolto] Aiuto: ciclo php ( for / while). popolare select dinamicamente da array id. PHP 9
Alessandro Le Mura [risolto] PHP problema memorizzazione array PHP 4

Discussioni simili