[ARRAY] Problemi con gli array associativi.

Ciao, ho un problemuccio con un array associativo.

In pratica dovrei 'camminare' all'interno di un array associativo per creare un semplice sistema di slider per visualizzare delle foto in sequenza.

Il percorso di ogni immagine è contenuto in un array associativo ad esempio:

$img = array('prima' => 'images/foto1.jpg', eccetera);

per far camminare l'array ho provato ha fare un next($img) o prev($img) in modo che tramite dei semplici tasti un utente possa andare avanti e indietro attraverso l'array.

Ma non funziona, ovvero parte sempre dalla prima foto e se gli chiedo current($img) mi da sempre e comunque il primo valore dell'array e non quello effettivamente corrente.

Ho provato anche la nuova funzione di iterazione trasformando un array in un oggetto, così da ottenere $iterator->seek(numero), ma numero deve essere un intero e non accetta i nomi simbolici delle chiavi.

Una vera fregatura, come faccio a risolverla?

inviato 10 anni fa
Marco Grazia
X 0 X

Ma sei sicuro che prev e next funzionano con gli array associativi? nel manuale non ci sono indicazioni, però ...

risposto 10 anni fa
LonelyWolf
X 0 X

OK, ho detto una cazzata, ho appena fatto una prova e funziona.

Per fare in fretta ho usato a b c come indici ma il principio è lo stesso.

Puoi postare + codice?

risposto 10 anni fa
LonelyWolf
X 0 X

Non ora che non ce l'ho sotto mano, ma sto pensando una cosa ovvero che la chiave nel mio caso, non è letterale ma numerica, nel senso che è un intero, per quanto questo possa significare in PHP, e forse è per questo che non legge l'array(?)

$img array(1 => 'path', 2 => 'path' ....);

e siccome ci sono dei salti, ovvero le chiavi non sono tutte sequenziali (1,2,3,4 ...) ma eseguono dei salti (1,2,3,10,11,15,20 ..) potrebbe essere lì il problema, ovviamente va verificata quest'ultima condizione.

risposto 10 anni fa
Marco Grazia
X 0 X

Se no puoi fare una cosa meno elegante, ma credo efficace, utilizzando un array di supporto.

Con array_keys

http://it2.php.net/manual/it/function.array-keys.php

ti carichi in un array le tue chiavi ed utilizzi next,prev su quelle, quando farai:

$chiave = current($array_supporto)

$array_originale[$chiave]

Sempre che ho capito cosa tu voglia fare...

PS una curiosità:

"Ho provato anche la nuova funzione di iterazione trasformando un array in un oggetto, così da ottenere $iterator->seek(numero)...."

scusa la mia ignoranza, ma qual'è questa funzione?

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

No il problema non è quello, ho provato così:

<?php
$img=array(1 => 'path1', 2 => 'path2', 3 => 'path3', 5 => 'path5', 6 => 'path6', 7 => 'path7');

echo current($img)."<-corrente<br />";
echo next($img)."<-corrente<br />";
echo next($img)."<-corrente<br />";
echo next($img)."<-corrente<br />";
echo next($img)."<-corrente<br />";
echo next($img)."<-corrente<br />";
?>

E funziona correttamente.

Mi viene un dubbione, non massacrarmi perchè è una domanda forse stupida, ma come passi il next e prev? Ricaricando la pagina? Se è così è normale che sia sempre la prima dato che l'array viene rigenerato ogni volta e quinid ogni volta parte dall'inizio.

risposto 10 anni fa
LonelyWolf
X 0 X

No a tutti e due  :D

Dunque: la pagina è una popup in cui si vede un'immagine, la popup viene richiamata tramite un link che passa come parametro la chiave corrispondente all'immagine da mostrare e fino a qui funziona, la potete vedere qui: www.faggianarte.com, entrate nel sito con ICONE e premete su un'immagine qualsiasi.

Ora nella popup che si apre con l'immagine, vorrei anche inserire una serie di link che permettano di mostrare le altre immagini tramite i soliti tasti avanti e indietro, e fino a qui bene, una cosa che si fa in html solitamente creando tanti file quante sono le immagini da mostrare.

Ma qui è diverso, la popup richiama un file in php a cui via get passa il numero corrispondente alla chiave dell'array dove c'è il path all'immagine, di per se una fesseria fatto così e infatti funziona.

Ora i tasti che permettono di vedere le altre immagini, dovranno richiamare anche loro la poup (cioè se stessa) passando la chiave precedente o la successiva, in modo da mostrare le altre immagini. Ma c'è un problema, dato che le chiavi non sono sequenziali non posso semplicemente passargli dei valori crescenti o decrescenti, certo potrei modificare i valori delle chiavi, ma siccome come potete vedere nel sito stesso, le immagini sono divise per categorie, non posso semplicemente mettere delle chiavi in sequenza numerica, dato che mi ritroverei un domani a dover riscrivere gli indici da capo e ciò non va bene.

Quello che vorrei fare in effetti non è diverso da ciò che si fa sui record, in fondo un array ricorda da vicino un record, ovvero trovare la chiave corrente dell'immagine mostrata e poi andare una chiave indietro o in avanti, partendo però da quella e non dall'inizio come accade ora.

Perché in effetti l'array lo attraverso con next e prev, ma sempre dall'inizio e non da dove sono in quel momento e ciò ovviamente, non va bene

risposto 10 anni fa
Marco Grazia
X 0 X

Scusa, non puoi mettere l'array in sessione? (ex $_SESSION['arr_img'] = $img )

Nel pop-up dovrebbe essere letta questa sessione.

Recuperi l'array nel po-up

$arr = $_SESSION['arr_img'];

//$arr = array('prima' => 'images/foto1.jpg', eccetera, 'seconda'=>'pippo.gif', 'terza'=>'pluto.gif'....);

$arr_chiavi = array_keys($arr);

//$arr_chiavi = array('prima','seconda','terza');

quando farai il link per il successivo o il precedente:

passerai l'indice dell'array $arr_chiavi

//pagina.php?successivo=$arr_chiavi[$i];

Recuperi quel valore:

$chiave = $_GET['successivo'];

$immagine = $arr[$chiave];

echo "<img src='".$arr[$chiave]."' ......>";

Così non potrebbe andare?

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Adesso sei stato chiaro!

E' più semplice di quel che pensi, vediamo subito la logica da seguire poi per il codice lo fai meglio tu di me.

viene aperta la popup con una $chiave=X, stabiliamo che il link per successiva sia N e P per precedente.

quindi il link che richiama l'immagine successiva sarà:

popup.php?chiave=$chiave&dove=N

e la precedente

popup.php?chiave=$chiave&dove=P

Non l'ho detto prima, ma popup.php deve controllare la presenza del parametro dove  prima di mostrare l'immagine, se non c'è il parametro dove carica l'immagine con la chiave selezionata, se c'è il parametro:

cerca nell'array la chiave $chiave e poi se N prende la successiva, se P prende la precedente ed imposta di nuovo $chiave al valore corrente (non quello ricevuto via get).

Oddio forse sono stato un po' criptico nello spiegare?

risposto 10 anni fa
LonelyWolf
X 0 X

Lore, sì avevo già pensato ad una soluzione simile a quella che hai dettatto tu, col doppio array per le chiavi, anche senza usare le sessioni potrei iterare l'array delle chiavi, e così ho risolto semplicemente, oggi ci provo e vi faccio sapere.

Lone, bene, ma mi pare complessa la procedura, inoltre dovrei modificare i link con una doppia chiave.

Il link passa una get numerica, e in fase di GET viene controllato che il valore passato sia un numero intero e non qualcos'altro, in questo modo scongiuro, almeno in parte, le injection via url, col tuo metodo dovrei fare questo controllo due volte e per quanto semplice, è un doppio forse inutile, comunque oggi pomeriggio farò delle prove e vi dirò.

risposto 10 anni fa
Marco Grazia
X 0 X
<?php
$img = array('prima' => 'images/foto1.jpg', 'seconda' => 'images/foto2.jpg','terza' => 'images/foto3.jpg','quarta' => 'images/foto4.jpg');

function get_previous($array, $key)
{
   $keys = array_keys($array);
   $pos = array_search($key,$keys);
   return ($array[$keys[$pos-1]]);
}

function get_next($array, $key)
{
   $keys = array_keys($array);
   $pos = array_search($key,$keys);
   return ($array[$keys[$pos+1]]);
}

echo get_previous($img, 'terza');
echo "\n";
echo get_next($img, 'prima');
?>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda