Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    41

    PHP - array da popolare tramite ciclo for, con variabili numeriche da incrementare

    Buongiorno,

    mi sono appena iscritto, ma in realtà seguivo già questo portale prima di smettere con la programmazione, oltre 10 anni fà. Ho ripreso a programmare perché in ufficio ho avuto la necessità di leggere dei file xls per poi estrapolarne i dati. Fino ad ora sono sempre riuscito a risolvere i problemi seguendo le discussioni, ma ora mi sono bloccato, anche perché non so se si può fare quello che cerco.

    Ho un array vuoto da popolare tramite ciclo for. Devo inserire i seguenti dati: professionista (se non è gia presente), professione (potrei anche fare un'unica stringa con il professionista, per poi dividerla in un secondo momento, quindi non è essenziale) e soprattutto, ogni volta, ho un numero da incrementare con una unità in base ad uno dei 4 tipi presenti. Forse mi spiego meglio con un esempio:

    codice:
    $professionista = 'Rossi Mario';
    $professione = 'Infermiere';
    $minuti_accesso = '45';
    if(!in_array($professionista, $array_N_accessi_operatori)){
                $array_N_accessi_operatori[] = $professionista;
                $array_N_accessi_operatori[$professionista] = ["15" => 0, "30" => 0, "45" => 0, "60" => 0];
            }
    In questo caso oltre ad inserire il professionista e la professione, devo anche incrementare da 0 ad 1 dove il tipo di accesso è '45'.

    E' possibile fare una cosa del genere? Ho fatto vari tentativi ma non ci sono riuscito.

    Grazie
    Ultima modifica di jip77; 06-10-2022 a 12:35

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    41
    Ho fatto qualche piccolo progresso. Vi posto il codice:

    Codice PHP:
    // ricavo un valore di "15", "30", "45" oppure "60"
    $minuti_accesso preg_replace('/[^0-9]/'''$trattamento);                if (!in_array($professionista$array_N_accessi_operatori)) {                        $array_N_accessi_operatori[$professionista] = ["15" => 0"30" => 0"45" => 0"60" => 0"professione" => $professione];                        $nuovo_valore $array_N_accessi_operatori[$professionista][$minuti_accesso];                        $nuovo_valore++;                        $array_N_accessi_operatori[$professionista][$minuti_accesso] = $nuovo_valore;
            } else {                        
    $nuovo_valore $array_N_accessi_operatori[$professionista][$minuti_accesso];                        $nuovo_valore++;                        $array_N_accessi_operatori[$professionista][$minuti_accesso] = $nuovo_valore;                    } 
    Quando inserisco un nuovo professionista ed incremento uno dei 4 contatori, il tutto funziona. Quando incremento uno dei 4 contatori (perché il professionista già esiste nell'array) funziona ancora regolarmente. Il problema ce l'ho con l'inserimento successivo su un professionista che già esiste, perché mi riporta tutti i contatori a 0, per poi aumentarne solo uno di 1 unità come all'inizio. Alla fine del lungo ciclo for, avrò solo 1 dei 4 contatori aumentato di una unità, mentre tutti gli altri saranno a 0.

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,448
    Il problema, o almeno uno, è che con la funzione in_array() tu controlli se c'è un valore col nome del professionista, invece tu la imposti come chiave dell'array, quindi il tuo script si comporta così:
    - cerca se c'è un valore col nome del professionista nell'array
    - non c'è, quindi crea un nuovo elemento con chiave il nome del professionista e come valore un array con i contatori a zero
    - incrementa il contatore desiderato

    quando vai ad incrementare il valore del professionista esistente:
    - cerca nei valori il nome del professionista, non c'è perché l'avevi impostato come chiave!
    - crea un nuovo elemento con chiave il nome del professionista e come valore un array con i contatori a zero

    di fatto sovrascrivi i dati inseriti in precedenza, non li modifichi.

    Devi controllare se esiste il professionista usando la funzione array_key_exists(), non in_array()

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    41
    Grazie per la risposta.

    Ho corretto il codice, semplificandolo anche:

    Codice PHP:
    if (array_key_exists($professionista$array_N_accessi_operatori)) {                        
    //il professionista già esiste, quindi incremento solo il contatore di una unità, in base ai minuti
    $array_N_accessi_operatori[$professionista][$minuti_accesso]++;
    } else {                       
    //inserisco il nuovo professionista, imposto i contatori a 0 ed inserisco la professione  
    $array_N_accessi_operatori[$professionista] = ["15" => 0"30" => 0"45" => 0"60" => 0"professione" => $professione];                       
    //aumento di una unità il contatore in base ai minuti          
    $array_N_accessi_operatori[$professionista][$minuti_accesso]++;                    

    I dati vengono inseriti e gli incrementi funzionano, ma penso di aver un altro problema. Nel fare il print dell'array, ho notato che dopo i 4 nomi dei professionisti presenti, viene mostrato per 4 volte il secondo professionista.

    codice:
    Array ( [VERDI MARIO] => Array ( [15] => 0 [30] => 0 [45] => 0 [60] => 8 [professione] => Fisioterapista ) [ESPOSITO CRISTINA] => Array ( [15] => 0 [30] => 6 [45] => 0 [60] => 2 [professione] => Infermiere ) [BIANCHI GIULIO] => Array ( [15] => 0 [30] => 0 [45] => 0 [60] => 6 [professione] => Fisioterapista ) [ROSSI MARA] => Array ( [15] => 0 [30] => 0 [45] => 0 [60] => 10 [professione] => Operatore socio-sanitario ) [1] => ESPOSITO CRISTINA [2] => ESPOSITO CRISTINA [3] => ESPOSITO CRISTINA [4] => ESPOSITO CRISTINA)
    La cosa strana è che quando vado a visualizzare il contenuto dell'array in una tabella, mi riporta per 4 volte sempre lo stesso nome, anche se poi, i dati mostrati sono corretti e rispecchiano quelli inseriti:

    Infermiere ESPOSITO CRISTINA 0 6 0 2
    Infermiere ESPOSITO CRISTINA 0 6 0 2
    Infermiere ESPOSITO CRISTINA 0 6 0 2
    Infermiere ESPOSITO CRISTINA 0 6 0 2

    Sicuramente sbaglio perché, per leggere l'array, utilizzo un ciclo for:

    Codice PHP:
    $n_dati count($array_N_accessi_operatori);
    for (
    $j 1$j <= $n_dati$j++) {
    //stranamente, anche se tolgo l'indice $j
    //mi da' comunque il nome del professionista $prof = $array_N_accessi_operatori[] = $professionista;
    $prof $array_N_accessi_operatori[$j] = $professionista;
    $acc_30 $array_N_accessi_operatori[$professionista]['30'];

    Il problema però penso sia a monte e non in fase di lettura
    Ultima modifica di jip77; 08-10-2022 a 21:12

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    Il tempo di vita di un'interazione per la variabile che non fa altro.

    Codice PHP:
    <?php

    $arr 
    = array(=> 'Mario Rossi'=> 'Mario Rossi');
    if(empty(
    $i)) {
    $i 0;
    }
    if(empty(
    $count) || $count $i) {
    $count count($arr);
    }

    foreach(
    $arr as $key => $value) {
    $professionista $value;

    if(isset(
    $professionista$array_N_accessi_operatori[$i][$professionista][45])) {
    $incremento $array_N_accessi_operatori[$i][$professionista][45] + 1;
    $array_N_accessi_operatori[$i][$professionista][45] = $incremento;
    $professionista NULL;
    $incremento NULL;
    $i $i 1;
    unset(
    $professionista$incremento);
    } elseif(empty(
    $professionista)) {
    //
    } else {
    $array_N_accessi_operatori[$i][$professionista][45] = 0;
    $i $i 1;
    }
    if(
    $count == $key) {
    break;
    }
    }

    //var_dump fine ciclo
    var_dump($array_N_accessi_operatori$i == $count); // ordinamento macchina, non necessariamente inizia da zero

    ?>
    La variabile $i è solo per l'indice di $array_N_accessi_operatori
    Ultima modifica di darbula; 09-10-2022 a 10:13

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    script.php versione 2.0 corregge cercando la professione di quella chiave.
    In questo esempio sto aggiungendo o valutando l'incremento della chiave 45.
    Codice PHP:
    <?php

    $array_N_accessi_operatori 
    = array(=> 'Mario Rossi'=> 'Mario Rossi');
    if(empty(
    $i)) {
    $i 0;
    }
    if(empty(
    $count) || $count $i) {
    $count count($array_N_accessi_operatori);
    }

    foreach(
    $array_N_accessi_operatori as $key => $value) {
    $professionista $value;
    $prfkey $key;

    if(isset(
    $professionista$array_N_accessi_operatori[$prfkey][$professionista][45])) {
    //incrementa il tuo array
    $incremento $array_N_accessi_operatori[$prfkey][$professionista][45] + 1;
    $array_N_accessi_operatori[$prfkey][$professionista][45] = $incremento;
    $professionista NULL;
    $incremento NULL;
    $prfkey NULL;
    $i $i 1;
    unset(
    $professionista$incremento$prfkey);
    } elseif(empty(
    $professionista)) {
    //
    } else {
    // Imposta il tuo array predefinito
    $array_N_accessi_operatori[$prfkey] = array($professionista, array(45 => 0));
    $professionista NULL;
    $prfkey NULL;
    $i $i 1;
    unset(
    $professionista$prfkey);
    }
    if(
    $count == $key) {
    break;
    }
    }

    //var_dump fine ciclo
    var_dump($array_N_accessi_operatori$i == $count); // ordinamento macchina o ordinamento come da programma inizio da zero, non necessariamente inizia da zero

    ?>
    $i è per debug se uguale a count, altrimenti professionista non trovato e quindi non uguale
    Ultima modifica di darbula; 09-10-2022 a 12:50

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    41
    Grazie darbula.
    Avevo messo il print dopo aver popolato l'array, ma erroneamente anche dopo averlo letto!!! Durante la lettura c'era qualcosa che mi alterava o aggiungeva altri dati. Ho eliminato momentaneamente il ciclo for che utilizzavo per leggerlo ed ho visto che l'array viene popolato correttamente con il codice che ho postato:

    if (array_key_exists($professionista, $array_N_accessi_operatori)) {
    //il professionista già esiste, quindi incremento solo il contatore di una unità, in base ai minuti
    $array_N_accessi_operatori[$professionista][$minuti_accesso]++;
    } else {
    //inserisco il nuovo professionista, imposto i contatori a 0 ed inserisco la professione
    $array_N_accessi_operatori[$professionista] = ["15" => 0, "30" => 0, "45" => 0, "60" => 0, "professione" => $professione];
    //aumento di una unità il contatore in base ai minuti
    $array_N_accessi_operatori[$professionista][$minuti_accesso]++;
    }


    Come posso leggere un array di questo genere? Se si potesse ordinare in ordine alfabetico per professionista sarebbe anche meglio.
    Prima con il ciclo for, come ho già detto, stampavo in una pagina HTML questi i dati tramite il codice che segue. Funzionava, ma mi restituiva per 4 volte i dati dello stesso operatore. Non riesco a venirne a capo. Sono sicuro di non dover utilizzare il ciclo for.

    Codice PHP:
    $array_N_accessi_operatori[$professionista]['professione']
    $array_N_accessi_operatori[] = $professionista
    $array_N_accessi_operatori
    [$professionista]['15']
    $array_N_accessi_operatori[$professionista]['30']
    $array_N_accessi_operatori[$professionista]['45']
    $array_N_accessi_operatori[$professionista]['60'

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    Se mostri solo parte del codice dove $professionista $minuti_accesso non sono nemmeno inizializati manca parte del codice, non posso scrivere codice in questo modo ma il mio codice precedente ti mostra array originale con un solo livello mentre poi se esiste il professionista o/e professione.

    L'array originale è con chiavi numeriche? Guarda nuovamente il mio script io cerco professionista di quella chiave non semplicemente il professionista che può essere presente più volte.
    Dunque
    Codice PHP:
    f(array_key_exists($professionista$array_N_accessi_operatori[$prfkey])) {

    $pfrkey è la chiave nel mio codice che usa foreach.

    script.php 3.0 aggiunto ordinamento ascendente con ksort e altre correzioni.
    Codice PHP:
    <?php

    // array originale un solo livello
    $array_N_accessi_operatori = array(=> 'Mario Rossi'=> 'Mario Rossi');
    if(empty(
    $i)) {
    $i 0;
    }
    if(empty(
    $count) || $count $i) {
    $count count($array_N_accessi_operatori);
    $y 0;
    }

    foreach(
    $array_N_accessi_operatori as $key => $value) {
    $professionista $value;
    $prfkey $key;

    if(isset(
    $professionista$array_N_accessi_operatori[$prfkey][$professionista][45])) {
    // Aggiorna il tuo array con valore incrementale
    $incremento $array_N_accessi_operatori[$prfkey][$professionista][45] + 1;
    $array_N_accessi_operatori[$prfkey][$professionista][45] = $incremento;
    $professionista NULL;
    $incremento NULL;
    $prfkey NULL;
    $i $i 1;
    unset(
    $professionista$incremento$prfkey);
    } elseif(empty(
    $professionista)) {
    //
    } else {
    // Aggiungi il tuo array predefinito da un livello
    // è diventato tre livelli nel codice seguente
    $array_N_accessi_operatori[$prfkey] = array($professionista, array(45 => 0));
    $professionista NULL;
    $prfkey NULL;
    $i $i 1;
    unset(
    $professionista$prfkey);
    }
    if(
    $count != $y) {
    $y $y 1;
    }
    else {
    break;
    }
    }

    //var_dump fine ciclo
    var_dump($array_N_accessi_operatori$i == $count$i$y); // ordinamento macchina o ordinamento da programma, non necessariamente inizia da zero
    ksort($array_N_accessi_operatori); // ordine ascendente con chiavi numeriche
    var_dump($array_N_accessi_operatori);

    ?>
    Ultima modifica di darbula; 09-10-2022 a 20:59

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2022
    Messaggi
    41
    Ora riesco a leggere correttamente tutti i dati, tranne il nome del professionista

    Codice PHP:
    foreach($array_N_accessi_operatori as $key => $value) {
    $test .= $array_N_accessi_operatori[$key]['professione'];
    //$test .= $array_N_accessi_operatori[$key]['professionista'];        
    $test .= $array_N_accessi_operatori[$key]['15'];        
    $test .= $array_N_accessi_operatori[$key]['30'];        
    $test .= $array_N_accessi_operatori[$key]['45'];        
    $test .= $array_N_accessi_operatori[$key]['60']."<br>";
    }    
    print_r($test); 
    Questo è il print:

    codice HTML:
    Fisioterapista0008
    Infermiere0602
    Fisioterapista0006
    Operatore socio-sanitario00010

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    Sbagli quando aggiorni il tuo array. Se scrivo $arr[0]['tizio'] difficilmente trovo $arr[0]['caio'] a meno che non è stato creato in precedenza.
    Rileggi il mio script.php 3.0 e nota il commento quando un livello e quando tre livelli.
    EDIT: Esempio esplicito da originale trasformato in quattro livelli:
    $arr[$pfrkey][$professione][$professionista] = array](45);
    Ultima modifica di darbula; 09-10-2022 a 21:08

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