• User

    Credo di aver risolto:
    se metti questo codice
    [php]if ( in_array($nomecitta, $all2) ) {[/php]il tutto funziona.
    Il tuo codice attualmente è questo:
    [php]if (in_array($nomecitta, ${$all2[$cont]})) {[/php]In pratica tu stai facendo l'accesso alla variabile con il nome uguale a $all2[$cont], ed è li l'errore. Non devi usare [$cont] se vuoi passare tutto l'array! In pratica tu stai passando ad in_array() non un array, bensi uno dei valori di cui è composto l'array. Quindi togliendo l'indice ( [$cont] ) il tutto si risolve.
    L'ho provato e funziona, non ci sono più errori, vedi tu se fa quello che avevi previsto.:wink3:


  • Moderatore

    No non ci siamo.
    Il codice deve cercare $città in ogni array col nome (es cerca Terni in $Giulio)
    Quindi
    [php]${$all2[$cont]}[/php]non è altro che
    [php]$Giulio[/php]con $all2 che contiene i vari nomi

    Ho comunque provato come mi suggerisci tu con $$all e $all
    Nel primo caso mi continua a dare errore, nel secondo non da errore ma ovviamente non funziona (sta cercando la città in Giulio non in $Giulio)


  • User

    Allora... Scusa se ho confuso il tuo problema, nel delirio di capire come risolverlo non l'ho inquadrato bene! 😞

    Dopodichè :?, credo stavolta di avercela fatta sul serio! 🙂 ( Spero.... )

    Cerco di andare per punti, spiegarlo è piuttosto difficile!

    • Come giustamente mi hai ricordato, tu devi fare l'accesso a $Giulio. Ma se $Giulio non è mai stata inizializzata, che valore ti restituisce PHP? NULL, che non è un array!
      Nel tuo codice infatti facevi riferimento, nell'array $all ad "Antonio" e "Daxo", ma le relative variabili $Antonio e $Daxo non esistevano!!!
      [php]$all = array (
      "Antonio" => "Napoli" ,
      "Daxo" => "Salerno" ,
      ); // ps: qua ti eri dimenticato il ; ( oppure è un errore di copia / incolla?? )[/php]
    • Inizializzando quelle variabili ad array ( il valore l'ho dato a caso ), il tutto sembra già prendere senso!
      [php]$Antonio = array("Napoli");
      $Daxo = array("Salerno");[/php]
    • Ti rimane ancora un errore... questo perchè nella riga del ciclo for
      [php]for ($cont=0; $cont <= $lungh_all; $cont++) {[/php]quel $cont <= $lungh_all fa si che tu esegua il ciclo fino ad un elemento oltre la fine dell'array $all. Questo perchè count() conta quanti elementi ci sono in un array, ma partendo da 1, non da 0, come sono indicizzati gli array!
      Quindi basta mettere
      [php]for ($cont=0; $cont < $lungh_all; $cont++) {[/php] ( occhio a quel $cont < $lungh_all )
    • Per accedere al valore che ti serve con la funzione in_array() devi mettere
      [php]${$all2[$cont]}[/php] ( che era già giusto, il problema di fatto stava tutto nelle inizializzazioni di variabili ).
      Quindi l'if diventa
      [php]if (in_array($nomecitta, ${$all2[$cont]})) {[/php]
    • A questo punto aggiornando la pagina dovrebbe essere tutto bianco, senza errori.
    • Se a questo punto provi ad inserire in $all anche $Troy, $Valentino, e le altre variabili, e cambi il valore di $nomecitta con uno dei valori inseriti nei rispettivi array, dovresti vedere finalmente i tuoi risultati!!! ( Io ho fatto la prova in locale e funziona... )

    Per comodità ho postato il codice anche su PasteBin, pastebin.com/5UJAj9EC

    Se hai ancora bisogno chiedi pure, ma spero proprio di avercela fatta 😄


  • Moderatore

    GRAZIE!!!

    In realta quegli array c' erano già, li avevo eliminati nel copiarli su pastebin.

    Comunque tu mi hai messo la pulce nell' orecchio e ho provato cancellando tutto e riscrivendo solo pochi valori per provare.

    Il codice funziona perfettamente, il problema è che su 300 e passa array probabilmente ne ho copiato male qualcuno.

    Grazie Mille Ancora

    Ivan


  • User

    Figurati!!

    Buon lavoro


  • Moderatore

    Un' ultima cosa
    Per non stare a scrivere tutte le citta nel caso sia in tutte le regioni ho fatto così:
    [php]$Umbriaprov = array (
    "Perugia" ,
    "Terni" ,
    );
    $Umbrialungh= count($Umbriaprov);

    $Julian4 = $Umbriaprov;[/php]

    Ma non funziona... dove sbaglio?


  • User

    Cosa significa che non funziona?
    Ti ritorna errori oppure non fa semplicemente quello che vuoi?

    Così ad una rapida occhiata sembrerebbe corretto, almeno dal punto di vista sintattico...


  • Moderatore

    Li conta come errori e mi da la reazione di prima:
    Warning: in_array() [function.in-array]: Wrong datatype for second argument on line 12


  • User

    Ora non sono sul mio pc, quindi non posso fare le prove necessarie, ma hai provato a passargli la variabile per referenza ( la butto li, non ho idea se funzioni )?
    [php]$Julian4 = &$Umbriaprov; [/php]


  • Moderatore

    Così la prende! Non conoscevo la referenza, non sono molto esperto di php

    Magari riesci a risolvermi anche questo doppio ciclo:
    [php]for ($cont=0; $cont < $lungh_all; $cont++) {
    while ($conta < $lunghprov) {
    if (in_array($prov[$conta], ${$all2[$cont]})) {
    echo '<div><a href="'.$urlsito.''.$all2[$cont].'"><img src="'.$urlsito.''.$all2[$cont].'/0.jpg" alt=""></a>'.$all2[$cont].'</div>';
    }
    }
    }[/php]Serve alla pagina delle regioni, prov contiene le varie province in array.
    Non mi da errore ma viene fuori vuoto
    Grazie


  • User Attivo

    Ciao Ivan88,

    Invece che utilizzare tutte queste variabili per conteggiare gli elementi degli array, potresti utilizzare la funzione foreach, che ti permette di esaminare gli array riga per riga con un costrutto molto semplice.

    Ho sistemato i tuoi post inserendo il tag php dove mancava... Il tag php è utilissimo quando si posta del codice (specialmente in questa sezione), poiché evidenzia la sintassi con i colori e permette una lettura più semplice a chi interviene per aiutarti. Qui trovi informazioni su come utilizzarlo, mi raccomando fanne buon uso! 😉

    Ah, nell'if prova a sostituire
    [php]${$all2[$cont]}[/php]
    con
    [php]$all2[$cont][/php]


  • User

    Puoi postare un pezzo di codice più lungo? Altrimenti è difficile venirne a capo....

    Per esempio, la variabile $conta dove viene inizializzata? Viene incrementata? Deve esserlo?
    $lungprov immagino sia il risultato di count($prov), ma senza vedere il tuo codice non posso esserne sicuro...


  • Moderatore

    Sì certo
    [PHP]
    ${$nomereg} = array ();
    $reg=${$nomereg};
    $prov1=''.$nomereg.'prov';
    $prov=$$prov1;
    $lungprov= count($prov);

    for ($cont=0; $cont < $lungh_all; $cont++) {
    while ($conta < $lunghprov) {
    if (in_array($prov[$conta], ${$all[$cont]})) {
    echo '<div><a href="'.$urlsito.''.$all[$cont].'"><img src="'.$urlsito.''.$all2[$cont].'/0.jpg" alt=""></a>'.$all2[$cont].'</div>';
    }
    }
    }
    [/PHP]

    Come si inizializza devo scrivere tipo $conta="1"; ?


  • Moderatore

    Grazie anche a te Luca per i consigli.

    Il foreach potrebbe facilitarmi la vita ma nel mio caso non penso di poterlo usare.
    Come posso ad esempio cambiare questa riga?
    [PHP]for ($contat=0; $contat < $lungprov; $contat++) {
    echo '<div><a href="'.$urlsito.'citta/escort_'.$prov[$contat].'.php">'.$prov[$contat].'</a></div>';
    }[/PHP]


  • User

    Andiamo per ordine:

    $conta lo puoi inizializzare a 0 ( devi scorrere una array, il cui indice parte da 0 )
    [php]$conta = 0; // non mettere "0" perchè inizializzi una stringa![/php]Così forse stampa qualcosa... Se i miei ricordi sono giusti, se PHP trova una variabile non inizializzata la inizializza con NULL, che poi viene interpretato come 0, stringa vuota, false e tutti i valori "nulli"...

    Per vedere se è così abilita gli errori di tipio E_NOTICE, che ti segnalano quando una variabile non è inizializzata ( qui un bell'articolo php.html.it/guide/lezione/2642/le-variabili/ verso metà pagina trovi un esempio di variabili non inizializzate ).

    Per il foreach ( php.net/manual/en/control-structures.foreach.php ), verrebbe così:
    [php]
    foreach ( $prov as $p ) {
    echo '<div><a href="'.$urlsito.'citta/escort_'.$p.'.php">'.$p.'</a></div>';

    }
    [/php]invece di
    [php]
    for ($contat=0; $contat < $lungprov; $contat++) {
    echo '<div><a href="'.$urlsito.'citta/escort_'.$prov[$contat].'.php">'.$prov[$contat].'</a></div>';
    } [/php]Ossia per tradurre in linguaggio:

    Per ogni $p elemento di $prov {
      esegui codice
    }
    
    

  • Moderatore

    Ok corretto,
    anche inizializzando la variabile non stampa comunque nulla.

    Il foreach funziona


  • Moderatore

    Sostituendo il while col foreach funziona perfettamente

    [PHP]for ($cont=0; $cont < $lungh_all; $cont++) {
    foreach ($prov as $p) {
    if (in_array($p, ${$all[$cont]})) {
    echo '<div><a href="'.$urlsito.''.$all[$cont].'"><img src="'.$urlsito.''.$all[$cont].'/0.jpg" alt=""></a>'.$all[$cont].'</div>';
    }
    }
    }[/PHP]


  • Moderatore

    Ciao a tutti,
    scusate ma si è ripresentato un proplema simile:

    Warning: array_rand() [function.array-rand]: Second argument has to be between 1 and the number of elements in the array

    Warning: Invalid argument supplied for foreach() in

    Per questo codice:

    [php]foreach ($all as $m) {
    foreach ($prov as $p) {
    if (in_array($p, $$m)) {
    array_push($reg,$m);
    }
    }
    }
    $reg2= array_unique($reg);
    $lungh_reg2= count ($reg2);
    echo $lungh_reg2;

    $chiave3 = array_rand ($reg2, $lungh_reg2);

    foreach ($chiave3 as $m) {
    $fin = $reg2[$m];
    echo '<div><a href="'.$urlsito.''.$fin.'"><img src="'.$urlsito.''.$fin.'/0.jpg" alt=""></a>'.$fin.'</div>';
    }[/php]La cosa importante è che il codice di per se funziona perfettamente e che il problema si presenta solo quando l' elemento da inserire in $reg *è uno solo!!! *
    Infatti al codice ho aggiunto echo $lungh_reg2; che di per se non serve, per vedere la lunghezza, ed esce 0!
    Mentre se gli elementi sono più di uno il numero è corretto. Come mai??

    Non ne vengo proprio a capo...

    Grazie Mille
    Ivan :ciauz:


  • Moderatore

    Errore Stupidissimo :arrabbiato:
    Il problema non è il codice precedente ma semplicemente il fatto che l' array_rand non funziona con lunghezze minori di 2.
    Ho risolto il problema con un semplice ifelse
    Per completezza posto il codice finale corretto:

    [PHP]foreach ($all as $m) {
    foreach ($prov as $p) {
    if (in_array($p, $$m)) {
    array_push($reg,$m);
    }
    }
    }
    $reg2= array_unique($reg);
    $lungh_reg2= count ($reg2);

    if ($lungh_reg2>1) {
    $chiave3 = array_rand ($reg2, $lungh_reg2);

    foreach ($chiave3 as $m) {
    $fin = $reg2[$m];
    echo '<div><a href="'.$urlsito.''.$fin.'"><img src="'.$urlsito.''.$fin.'/0.jpg" alt=""></a>'.$fin.'</div>';
    }
    }
    else if ($lungh_reg2==1){
    echo '<div><a href="'.$urlsito.''.$reg2[0].'"><img src="'.$urlsito.''.$reg2[0].'/0.jpg" alt=""></a>'.$reg2[0].'</div>';
    }[/PHP]