Dai, sta cercando di capire come funzionano le cose, meglio partire passo passo scrivendo anche più codice, ma rendendolo chiaro... altrimenti per compattezza ed efficienza
Ho mantenuto i 2 array separati perché mantengono una complessità computazionale lineare invece che quadratica, l'array singolo essendo bidimensionale richiede 2 cicli annidati per essere scansionato, infatti hai dovuto usare 2 foreach() uno dentro l'altro, quindi complessità O(n^2), il mio codice ha complessità O(n)Codice PHP:
$pulsante_p1 = array();
$pulsante_p2 = array();
$totali = 0;
$textfile = fopen("click.txt", "r");
while ( $rigafile = fgets($textfile) )
{
$totali++;
$campiriga = explode("|", $rigafile);
$cliccato = $campiriga[0];
$ip = $campiriga[2];
array_key_exists($ip, ${'pulsante_'.$cliccato}) ?
${'pulsante_'.$cliccato}[$ip] += 1 :
${'pulsante_'.$cliccato}[$ip] = 1;
}
foreach ( $pulsante_p1 as $key => $value )
{
echo "L'indirizzo $key ha cliccato $value volte sul pulsante 1<br>";
}
foreach ( $pulsante_p2 as $key => $value )
{
echo "L'indirizzo $key ha cliccato $value volte sul pulsante 2<br>";
}
echo "Click totali: $totali";
Ultima modifica di Alhazred; 12-08-2016 a 09:43
^^^
infatti lo scopo era quello di mostrargli un modo diverso per risolvere il problema, poi che didatticamente sia meglio essere prolissi nel codice non ci sono dubbi
Grazie infinite per le risposte
aiutandomi con il manuale mi sembra di capire che se l'indirizzo $ip e' settato (quindi e' presente/esiste gia') nel array $pulsante, mi da un risultato positivo, giusto?
quindi nel comando array_key_exists () va prima cosa si vuole cercare nel array (nel nostro caso $ip) e poi l'array in cui cercare (nel nostro caso $pulsante)
il foreach mi sembra molto strano come ciclo rispetto al while e al for.foreach() puo' essere usato in due modi:
1) foreach($array as $value)
in questo caso si cicla sull'array $array e si prende il valore di ogni elemento, chiaramente $value puoi chiamarla come vuoi, anche $pippo o $xyz o qualsiasi nome valido
2) foreach($array as $key => $value)
in questo caso si prende in considerazione anche l'indice di ogni elemento durante il ciclo, l'indice dell'elemento corrente viene messo nella variabile $key, il valore nella variabile $value
come per il primo caso per i nomi delle variabili puoi metterci quello che vuoi, solo il nome dell'array � vincolato all'array su cui vuoi ciclare, quindi anche
foreach($array as $frittata => $ombrello)
� valido, basta che ti ricordi tu cosa sia $frittata e cosa sia $ombrello
Da quello che ho capito, e' un ciclo che mi permette di scorrere gli elementi di un array associativo, quindi array che hanno come indice una stringa e non un numero.
1) che vuol dire si prende il valore? cioe' si considera il valore di ogni elemento?
se ho
foreach($array as $value){
echo "i valori sono $value";}
visualizzo tutti i valori memorizzati nell'array?
2)mi stai dicendo che con questa dicitura
foreach($array as $key => $value)
$key viene ad essere usato in questo istante per la prima volta e viene valorizzato per ogni ciclo con l'indice dell'array $array, mentre invece $value viene valorizzato per ogni ciclo con il valore
hai centrato la finalità, anche se non immaginavo che dovessi usare gli array
forse l'ultimo codice di Alhazred è quello risolutivo al momento, ma devo studiarlo meglio, però ho visto che non ha il passaggio per riferimento e mi pare più lineare al momento per me
Ultima modifica di Alfoxx; 12-08-2016 a 10:54
array_key_exists() funziona così: prende l'array che gli viene passato come secondo parametro (per noi $pulsante) e controlla per ogni elemento se il suo indice è uguale alla variabile che gli si passa come primo parametro (per noi $ip)
quindi supponendo di avere
$ip = '127.0.0.1';
$pulsante = array( '192.168.1.1' => 3, '127.0.0.1' => 2 );
quindi 2 elementi, uno con indice 192.168.1.1 e valore 3, l'altro con indice 127.0.0.1 e valore 2
la funzione restituirà true, perché un elemento con indice 127.0.0.1 nell'array è presente, se non ci fosse restituirebbe false.
foreach() lo puoi usare in ogni caso, con qualsiasi array.il foreach mi sembra molto strano come ciclo rispetto al while e al for.
Da quello che ho capito, e' un ciclo che mi permette di scorrere gli elementi di un array associativo, quindi array che hanno come indice una stringa e non un numero.
Diversamente da for e while, per foreach non hai bisogno di sapere il numero di elementi presenti nell'array, con for ad esempio per scorrere tutto l'array dovresti fareCodice PHP:
// Avendo
$array = array ( 'elemento 1', 'elemento 2', 'elemento 3' );
// quindi un array non associativo, ma con indice numerico, puoi ancora fare
foreach( $array as $key => $value )
{
echo "Indice $key, valore $value<br>";
}
// che stamperebbe
// Indice 0, valore elemento 1
// Indice 1, valore elemento 2
// Indice 2, valore elemento 3
for ( $i=0; $i < count($array); $i++ )
quindi devi contare quanti elementi ha, foreach invece ci pensa da solo
Inoltre foreach ti permette un accesso più comodo alle informazioni dell'array, sia all'indice che al valore.
Comunque non ti preoccupare, i primi tempi foreach() sembrava strano anche a me, ma una volta che capisci come funziona non usi altro per ciclare sugli array.
Esatto, foreach() cicla su tutto l'array, un elemento alla volta e ad ogni ciclo mette nella variabile $value il valore dell'elemento che sta esaminando durante quella iterazione.1) che vuol dire si prende il valore? cioe' si considera il valore di ogni elemento?
se ho
foreach($array as $value){
echo "i valori sono $value";}
visualizzo tutti i valori memorizzati nell'array?
Sì, anche $key cambia ad ogni iterazione del ciclo, come $value, solo che in $key ci sarà l'indice dell'elemento corrente, in $value ci sarà il suo valore.2)mi stai dicendo che con questa dicitura
foreach($array as $key => $value)
$key viene ad essere usato in questo istante per la prima volta e viene valorizzato per ogni ciclo con l'indice dell'array $array, mentre invece $value viene valorizzato per ogni ciclo con il valore
Con un esempio:
quindi:Codice PHP:
$array = array ( 'primo' => 'elemento 1', 'secondo' => 'elemento 2', 3 => 'elemento 3' );
foreach($array as $key => $value)
{
echo "Indice $key, valore $value<br>";
}
// stamperà
// Indice primo, valore elemento 1
// Indice secondo, valore elemento 2
// Indice 3, valore elemento 3
prima iterazione -> $key = 'primo', $value = 'elemento 1'
seconda iterazione -> $key = 'secondo', $value = 'elemento 2'
terza iterazione -> $key = 3, $value = 'elemento 3'
Sì, ma se devi mostrarlo a scuola ad un professore non farlo, ci sono cose che sicuramente non vi ha spiegato, mi riferisco all'uso di "variable variable" ovvero variabili con nome variabile, se poi il professore fosse uno che apprezza lo spirito di iniziativa allora puoi provarci a portarglielo, poi però ci dici come è andataforse l'ultimo codice di Alhazred è quello risolutivo al momento, ma devo studiarlo meglio, però ho visto che non ha il passaggio per riferimento e mi pare più lineare al momento per me
Ultima modifica di Alhazred; 12-08-2016 a 11:32
Grazie Alhazred, i tuoi esempi sono fondamentali per capire meglio...prendo carta e penna e ne riproduco alcuni
Considerando uno dei codici che mi hai postato per esempio:
codice:$array = array ( 'primo' => 'elemento 1', 'secondo' => 'elemento 2', 3 => 'elemento 3' ); foreach($array as $key => $value) { echo "Indice $key, valore $value<br>"; } // stamperà // Indice primo, valore elemento 1 // Indice secondo, valore elemento 2 // Indice 3, valore elemento 3
sia $key che $value non le inizializzi da nessuna parte. Li usi per la prima volta nel ciclo foreach
variabile variabile ti riferisci a questo?
se si, non ti preoccupare, l'avevo già vista questa cosa e quando l'ho scoperta mi aveva colpito tanto
array_key_exists($ip, ${'pulsante_'.$cliccato}) ?
${'pulsante_'.$cliccato}[$ip] += 1 :
${'pulsante_'.$cliccato}[$ip] = 1;
EDIT: Ma risolvere come stavo tentando io cioè con i confronti e le variabili d'appoggio non si può proprio?
Ultima modifica di Alfoxx; 12-08-2016 a 12:14
Esatto, ci pensa foreach() a valorizzarle.
In generale in PHP non c'è bisogno di dichiarare le variabili prima di usarle, solo nei casi in cui si deve sapere il valore che ha una variabile è necessario che sia inizializzata da qualche parte, per esempio se fai
$var1 = $var2 + 5;
e da nessuna parte hai dato un valore a $var2 avrai un problema, perché PHP non sa quanto vale $var2
$var1 però anche se non l'avevi inizializzata da nessuna parte non da problemi, perché per come la si sta usando non importa il suo valore, ci si scrive solo dentro, non viene letta.
Questo è ciò che accade nel foreach() $key e $value vengono prima scritte dalla funzione, poi verranno lette all'interno della funzione, quindi non importa il loro valore iniziale, si possono usare senza averle dichiarate da nessuna parte.
Sì, mi riferisco a quel pezzo di codice.variabile variabile ti riferisci a questo?
se si, non ti preoccupare, l'avevo già vista questa cosa e quando l'ho scoperta mi aveva colpito tanto
Ultima modifica di Alhazred; 12-08-2016 a 12:17
si in quest'occasione $var1 = $var2 + 5 si deve valorizzare $var2, come poi ho fatto anche io nei miei tentativi.
Ma risolvere come stavo tentando io cioè con i confronti e le variabili d'appoggio non si può proprio?
Lo chiedo non perchè non voglio ampliare i miei orizzonti, ma solo per sapere se avevo delle chance o no
Certo che si può, ma risulta molto più complicato stare dietro a tutto.
esatto
il problema che mi pongo nella programmazione, per cui non ne volevo sapere nulla e che mi ha portato a non lavorare per due/tre anni , era che devi tenere a mente tremila cose che non so gestire tutte e perdo le giornate intere senza risolvere, ed io che tengo alle cose a fine giornata sono distrutto e demoralizzato.
Io infatti nel primo post, volevo proprio chiedere di capire come bisogna ragionare riga di codice per riga di codice per poter programmare con una certa filosofia ("dividi et impera") e non perdermi in ragionamenti che non portano a nulla