Newsgroup: it.comp.www.php
Titolo: foreach che nn funziona





ciao ragazzi


dunque devo svolgere un compito in php 
ovviamente


utilizzando il foreach all'interno di una 
function


lho fatto ma... mi da un errore e nn capisco cosa 
sbaglio


cioe di sicuro assegno in maniera errata un 
valore


ma nn mi e' ben chiaro cosa..


 


mi date una mano please..?


ecco il codice


 


 


$Nome="yyyyyyy"; 

$Cognome="xxxxx"; 
$Telefono="0000000000"; 
function 
RicercaDato($Dati) 
        { 

       foreach  ($Dato as $Key 
=>$Value) 
                  { 
                     if 
($Value=$Nome)  {print 
($Nome);} 
                     elseif 
($Value=$Cognome)  {print 
($Cognome);} 
                     
elseif ($Value=$Telefono)   {print 
($Cognome);} 
                    else 
{ print ("non è presente in 
rubrica");}     
                   } 
                 
        
 }       
     



 


     

 print 
RicercaDato($Agenda);
  
      $Agenda= 
array 
("$Nome<br>$Cognome<br>$Telefono<br>");


 


 


 


qui l'errore che da


http://212.31.232.114/DANIELAJOB/RUB2.PHP


 



       $Agenda= array ("$Nome<br>$Cognome<br>$Telefono<br>");
qui la dichiarazione dell'array è sbagliata, gli elementi non vanno
separati
da codice html, bensì da virgole, vedi
http://it.php.net/manual/it/language.types.array.php
rae

<?
// Agenda
$phonebook=array(
    array(
            "name"    => "Virginio",
            "last_name"   => "Scottelli",
            "int_prefix"    =>"0039",
      "loc_prefix"  => "02",
            "phone"   => "123456789",
            "city"      => "Milano",
    ),
    array(
            "name"    => "Oronzo",
            "last_name"   => "Scottapolli",
            "int_prefix"    =>"0039",
      "loc_prefix"  => "02",
            "phone"   => "223456789",
            "city"      => "Milano",
    ),
    array(
            "name"    => "Guascotto",
            "last_name"   => "Scottello",
            "int_prefix"    =>"0039",
      "loc_prefix"  => "02",
            "phone"   => "223456789",
            "city"      => "Milano",
    ),
    array(
            "name"    => "Gervaso",
            "last_name"   => "Mastroscotta",
            "int_prefix"    =>"0039",
      "loc_prefix"  => "02",
            "phone"   => "223459789",
            "city"      => "Milano",
    ),
);
// traduzione in italiano dei campi
// meglio non usare caratteri accentati come nome campo, ad esempio "Città"
// personalmente uso una pseudoforma inglese che è senza accenti
// e poi produco un array di traduzione per lingua
$translations=array(
 "ita"=> array(
       "name"    => "Nome",
       "last_name"  => "Cognome",
       "int_prefix"   => "Prefisso Int.",
       "loc_prefix"  => "Prefisso",
       "phone"   => "Numero",
       "city"    => "Città",
    "not_found"   => "non trovato!",
    "record"    => "Contatto n°",
    "id"     => "ID Rubrica",
    "search_for" => "Stringa di ricerca",
    "values_founds" => "Valori trovati",
    "contacts_founds"=> "Contatti trovati",
  ),
);
// la funzione ricerca dato prende in input
// $phonebook_array = la rubrica (array)
// $lang = la lingua (string) --> disponibile solo "ita"
// $search_value = il valore da cercare (stringa)
// $extact_match =  indica se cercare il valore esatto (true)
//     o di cercare la stringa anche come porzione di testo
//     nelle stringhe dei contatti (false -> valore di default)
function 
ricercaDato($phonebook_array,$lang,$search_value,$extact_match=false){
    // assegno l'array $translations come globale...
 global $translations;
 // ...e prelevo la lingua che mi interessa
 $l=$translations[$lang];
 // Abbrevio il nome dell'array contenente la rubrica
 $d=$phonebook_array;
 // creo la string a di output
 $str="";
 // pulisco la stringa da cercare da eventuali spazi esterni e la trasformo
 // in minuscolo per essere sicuro di ottenere tutti i valori possibili
 $sv=trim(strtolower($search_value));
    // creo un arrray per valori multipli ritrovati (esempio gente com lo 
stesso cognome)
 $f=array();
 // base dell'html con gli stili
    $str.="<style>\n";
 $str.="body,td{font:normal 11px Verdana;}\n";
 $str.="table{border:1px solid #999999;}\n";
 $str.="td{border-bottom:1px solid #cccccc; padding: 2px; 
padding-left:10px;}\n";
 $str.=".head{border-bottom:1px solid #66cc00; padding: 3px; 
background-color:#eeeeee}\n";
 $str.=".separator{font-size:1px;border-bottom:1px solid #cc0000;}\n";
 $str.=".id{border-bottom:1px solid #0066cc; padding: 2px; 
background-color:#e5e5e5;}\n";
 $str.=".evid{color:#cc0000;}\n";
 $str.="</style>";
 $str.="<table>";
 $str.="<tr><td class='head'><b>".$l["search_for"]."</b>&nbsp;</td><td 
nowrap class='evid'><b>".ucfirst($search_value)."</b></td><tr>";
    // cerco in tutti i sub-records di ogni record la stringa
 foreach($d as $k=>$v){
  foreach($v as $kv=>$vv){
            // per comodità trasformo in minuscolo e pulisco le stringhe in 
cui effettuare la ricerca
   $vv_t=strtolower(trim($vv));
            // se exact_match è true cerco solo le stringhe esattamete 
corrispondenti
   // alla stringa cercata (tranne per il case dei caratteri)
            // altrimenti cerco la stringa in ogni pezzo delle stringhe dei 
records.
   // nell'array $f archivio solo l'id del contatto trovato cioè al chiave 
dell'array esterno di phonebook
   if($extact_match){
    if($sv==$vv_t){
     $f[]=$k;
    }
   }else{
                if(strpos($vv_t,$sv)!==false){
     $f[]=$k;
    }
   }
  }
 };
 // a questo punto controllo quante volte è stata trovata la stringa
 // se per esempio un contatto della rubrica è "Francescotto Scotti"
 // le ricorrenze per un unico contatto con la ricerca "scott" saranno 2
 $r=sizeof($f);
    // Scambio i valori con le chiavi in modo che le ricorrenze di uno 
stesso
 // contatto vengano scovate ed eliminate con array_unique() che trova le 
chiavi con lo stesso valore e le elimina.
 $f=array_flip($f);
    $f=array_unique($f);
    // riporto l'array nello stato iniziale ma ripulito dalle ripetizioni.
    $f=array_flip($f);
    // essendo stato precedentemente (la prima volta) flippato, le keys
 // hanno perso l'andamento numerico progressivo
 // perchè sono state trasformate in stringhe.
 // Per azzerarle uso array_values che preleva le chiavi
 // riassegnando tutti i valori di $f.
 // In questo modo le chiavi vengono nuovamete disposte in ordine 
progressivo;
   $f=array_values($f);
 // se l'array $f ha almeno una chiave...
 if(sizeof($f)!=0){
        // scrivo l'array in una stringa html
  // indicando per comodità le statistiche.
  $str.="<tr><td 
class='head'><b>".ucfirst($l["contacts_founds"])."</b>&nbsp;</td><td nowrap 
class='evid'><b>".sizeof($f)."</b></td><tr>";
  $str.="<tr><td 
class='head'><b>".ucfirst($l["values_founds"])."</b>&nbsp;</td><td nowrap 
class='evid'><b>".$r."</b></td><tr>";
  foreach($f as $k=>$v){
   $str.="<tr><td colspan='2' class='separator'>&nbsp;</td><tr>";
   $str.="<tr><td colspan='2' 
class='id'><b>".$l["record"]."</b>&nbsp;".(1+$k)." - 
<b>".$l["id"]."</b>:&nbsp<b class='evid'>".$v."</b></td><tr>";
   foreach($d[$v] as $kv=>$vv){
                $vv_t=strtolower(trim($vv));
    $add_cl="";
                 if(strpos($vv_t,$sv)!==false){
                  $add_cl="class='evid'";
     }
    $str.="<tr><td nowrap ".$add_cl.">".ucfirst($l[$kv])."</td><td 
nowrap><b>".ucfirst($vv)."</b></td><tr>";
   }
  }
 }else{
  // ... se è vuoto... messaggio di errore in lingua
        $str.="<tr><td colspan='2'>".ucfirst($search_value)."</b> 
".$l["not_found"]."</td><tr>";
 };
 $str.="<tr><td colspan='2' class='separator'>&nbsp;</td><tr>";
 $str.="<table>";
 return $str;
};
// test con lingua "ita" e ricerca "scotta"
echo ricercaDato($phonebook,"ita","scotta",false);
? 

oviamete la precedente è una funzione con ricerca in tutti i campi.
se vuoi puoi arricchire la funzione in modo che cerchi la stringa solo in un 
campo specifico o che estenda la ricerca.
volevo solo indicarti come si usa foreach e come creare un ouptup e mi sono 
lasciato predere la mano.
________
per trovare stringhe complesse ti conviene fare in modo che i subarray 
diventino una stringa unita da spazi con implode e poi tentare
1) la ricerca a stringa esatta con strpos
2) la ricerca per singola parola nella stringa eseguendo un explode per 
carattere spazio della stringa passata come ricerca o meglio ancora puoi 
tentare con una espressione regolare complessa a cercare tutti i valori 
usando preg_match_all
_____
spero di non aver detto boiate. 

 (per distinguere meglio un confronto da un'assegnazione)
veramente e' un errore.
perche' un'assegnazione non e' un'operazione di confronto. usare = al
posto di == non fa quello che uno si puo' aspettare: non cofronta i due
termini ma assegna il valore del secondo al primo, e ritorna sempre TRUE

 ha scritto nel messaggio
news:452705d5$0$995$5fc...@news.tiscali.it...


 come posso fare?


 allora mettila cosi'


 ti manca l'array iniziale in cui iterare col 
foreach.


Prima devi avere AGENDA.


Agenda non può essere una stringa come hai fatto tu 
(se non puoi uar strpos o l eespressioni regolari), ma deve essre un array di 
array


cioè ogni singolo contatto (persona) deve essere 
archiviata come un array di informazioni semplici.








$Agenda=array(
    
array(
        
"name"=>"Mike",
        
"last_name"=>"Bongionro",
        
"phone"=>"0123456789",
    ),
    
array(
        
"name"=>"Rosario",
        
"last_name"=>"Fiorello",
        
"phone"=>"1234567890",
    ),
);


 


function 
ricercaDato($agenda_array,$stringa_da_cercare){
     
$found=array();
     foreach($agenda_array as 
$k=>$v){
         // imposto un 
controller vper verificare quando la ricerca ha buon fine in uan 
iterazione.
         
$trovato=false;
      // siccome $v (value) è a sua 
volta una array...
         
foreach($v as 
$kv=>$vv){
                 
if($vv==$stringa_da_cercare){
                 
    // se lo trova, restituisce trovato e non lo azzera 
finchè
            // 
l'array contenente tutti gli altri dati del contatto non è memorizato in 
found
         
    $trovato=true;
                  
}
         
}
         
if($trovato){
         
   // usando come chiave la chiave unica dell'array agenda 
in
       //array found praticamete 
eseguo
           
  //delle sovrascritture nel caso di ricerca con più di un esito 
positivo
       //nello stesso contatto 
(esempio uno che si chiama Franco 
Franco)
              
$found[$k]=$v ;
         
}
     }
    // il tag html pre fa in 
modo da usare testo preformattato
  echo 
"<pre>";
    // uscito dal ciclo stampa a video tutti i 
risultati
  foreach($found as 
$k=>$v){
        
print_r($v);
    }
  echo 
"</pre>";
}


 


ricercaDato($Agenda,"Rosario");








 


Alla funzione RicercaDato devi passare sia l'array 
in cui cercare (AGENDA) sia la stringa o l'array di ricerca


quindi eseguire dei foreach innestati per cercare 
nell'array globale agenda un elemento del subarray "contatto" che è uno dei 
tanti subarray che contengono le singole info dei contatti.


controllare l'uguaglianza dei singoli dati con la 
stringa di ricerca ( e ripeto uguaglianza significa anche occhio a maiuscole e 
minuscole a questo punto visto che non puo usare altre funzioni.)


 


quindi 


function ricercaDato($agenda,$stringa_da_cercare){ 
ecc ecc }


 


se posti la "traccia" del compito posso scrivere 
una funzione a te più congeniale ma se sei in ufficio e ci lavori non puoi fare 
come a scuola che ti chiedono un compito e lo devi fare per forza con quelle 
funzioni perchè sai solo quelle. prendi quello che ho scritto nel post 
precedente, schiaffalo in un file PHP e testalo. Una volta visto il 
funzionamento, prenditi il manuale PHP su 
php.net
 in formato CHM in italiano (è 
parzialente tradotto) e cerca di guardare le singole funzioni php usate tipo 
"strpos" e lo stesso foreach, cerca anche fra le funzioni che vengono abbinate 
in calce ad ogni funzione del manuale.


ciao.



T_PAAMAYIM_NEKUDOTAYM ha scritto:

è vero, chiedo venia!

ehi.. ciao grazie per la tua risposta..
ma purtroppo nn mi e' chiara, ma perche di php so ben poco sorry...
Dunque
il compito e' questo
creare una rubrica "fuffa" solo per capire come usare i comandi
spiegati.
ovvero if elseif e else
function
array
foreach
e va svolto cosi:
creare tre variabili e nn settarle per farlo poi in un secondo momento
se serve
$Nome
$Cognome
$Telefono
poi.. creare una funzione che stampa a video i dati della rubrica
e questo sn riuscita a farlo
ma nel caso in cui viene cercato un dato tramite
rub2.php?Nome=Ciccio
quindi dal link
e il CICCIO nn esiste da nessuna parte...
la 2° function chiamata RICERCA  per esempio, deve quindi cercare e se
quel nome nn e' stato settato deve STAMPARE LA SCRITTA NOME NN PRESENTE
IN RUBRICA.
e se  invece esiste... lo stampa utilizzando la function precedente
dove stampa a video i dati della rubrica.
il tutto sempre utilizzando comandi come array.. foreach if elseif else
e le function
ma nn riesco proprio a metterlo giu a scrivere il codice... :((

ho scritto qlcosa
ma nn funziona
PLEASE AIUTO... NN SO COSA FARE  e devo consegnare il tutto entro le
13.. :(((((((((
<?php
$Nome="Ciaooo";
$Cognome="Miaoooo";
$Telefono="000000000";
function RicercaDato($Dati)
	   {
                         foreach  ($Dati as $Key => $Value);
                             {
	              if     ($Value==$Nome) {print ($Nome);}
	              elseif ($Value==$Cognome) {print ($Cognome);}
	              elseif ($Value==$Telefono){print ($Telefono);}
	               else   {print ("non è presente in rubrica");}
	              }
                 }
$Agenda= array ($Nome,$Cognome,$Telefono);
print RicercaDato($Agenda);
 
?>

13.. :(((((((((


Azz! sono in ritardo.. nel caso comunque abbiano 
avuto pietà di te e premettendo 
che sta cosa è 
sbagliata, forse così fa quello che cerchi... 


 




------------------------------


$Nome="Ciaooo";
$Cognome="Miaoooo";
$Telefono="000000000";


 


function 
RicercaDato($Dati){
  global  $Nome, $Cognome, 
$Telefono;
 foreach  ($Dati as $Key => 
$Value){
   if($Value==$Nome) 
{
    print ($Nome);
   }elseif 
($Value==$Cognome) {
    print 
($Cognome);
   }elseif 
($Value==$Telefono){
    print 
($Telefono);
   }else{
    print ("Non 
è presente in rubrica");
    
}
  }
}


$Agenda= array 
($Nome,$Cognome,$Telefono);


RicercaDato($Agenda);


---------------------------------


 


L'errore è questo: se non passi le variabili di 
confronto alla funzione non hai nulla da confrontare.


In questo caso ho dichiarato come globali le tre 
variabili di confronto (nome cognome telefono), ma potresti passarli anche come 
argomento della funzione. l'output è "attaccato".


Insomma l'unico errore è quello di non dichiarare 
le variabili di confronto come globali o di non passarle come argomenti della 
funzione 


(function 
RicercaDato($dati,$nome,$cognome,$telefono){...} )


Non c'è bisogno di scrivere "print 
RicercaDato($agenda)" perchè la funzione non ha un return di tipo stringa ma 
scrive lei stessa 


l'output.


Diciamo che l'errore di logica è questo: ricerchi 
un cottatto in una rubrica che può avere solo un contatto.


Ragioniamo secondo la logica della funzione così 
come l'hai scritta: 


L'array agenda puo' contenere tanti nomi e tanti 
cognomi... ma così com'è concepita,  i nomi e i cognomi non sono correlati 
ma liberi di accoppiarsi secondo la stringa di ricerca.


se infatti inserisci:


 


$Nome_0="Gerry";
$Cognome_0="Scotti";
$Telefono_0="000000000";


 


$Nome_1="Michelle";
$Cognome_1="Hunziker";
$Telefono_1="111111111";




 


e componi l'agenda in questo modo


 


$Agenda= array 
($Nome_0,$Cognome_0,$Telefono_0,$Nome_1,$Cognome_1,$Telefono_1);


 


La ricerca per
 


 




$Nome="Michelle";
$Cognome="Scotti";
$Telefono="000000000";


 


darebbe comunque un output positivo e non un 
errore!


 


Tieni presente pero' di guardarti la funzione che 
ti ho postato la prima volta (quella complessa) che effettua veramete una 
ricerca (seppur limitata a una string) in una rubrica reale.


 


Ciao




darebbe comunque un output 
positivo e non un errore!


mi correggo darebbe un outpt composto da eisiti 
positivi e messaggi di errore!


insomma la cosa in se è 
sbaglita.



insomma la cosa in se è 
sbaglita.


e anceh "in sè" senza accento è 
sbagliato.