/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Navigering i et array
Fra : Bertel Lund Hansen


Dato : 04-01-07 04:30

Hej alle

Hvordan kommer man fra en post i et array til de to naboer? Det
er et associativt array der tilgås uden numre.

Den mulighed jeg kan se, består i:

1. Gennemløb arrayet og tilføj nummeret på én eller anden måde
(f.eks. til en streng hvorfra det senere kan eksploderes)

2. Opret et simpelt array med array_keys().

3. Når man har fat i et element, findes nummeret, og så kan man
finde naboerne ved at justere nummeret og finde den nødvendige
nøgle i hjælpearrayet.

Men det er ret omstændeligt.

Der er ikke tale om et gennemløb hvor man på forskellige måder
ville kunne benytte en tæller (men selv da ville man behøve
hjælpearrayet og omvejen).

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

 
 
Peter Brodersen (04-01-2007)
Kommentar
Fra : Peter Brodersen


Dato : 04-01-07 05:01

On Thu, 4 Jan 2007 04:29:45 +0100, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Hvordan kommer man fra en post i et array til de to naboer? Det
>er et associativt array der tilgås uden numre.

prev(), next() og current() er dine venner til at navigere rundt.

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (04-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 04-01-07 05:30

Peter Brodersen skrev:

> prev(), next() og current() er dine venner til at navigere rundt.

Nej, de virker kun hvis man er i en løkke.

Efter linjen

   $picinfo=$_SESSION['pictureinfo'][$picturename];

giver

   $pinfo=prev($_SESSION['pictureinfo']);

bare en tom streng, mens .

   $pinfo=next($_SESSION['pictureinfo']);

læser info fra billede 1 (nabo til 0) hver gang.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Jesper Brunholm (04-01-2007)
Kommentar
Fra : Jesper Brunholm


Dato : 04-01-07 10:36

Bertel Lund Hansen skrev:
> Hvordan kommer man fra en post i et array til de to naboer? Det
> er et associativt array der tilgås uden numre.

Altså af typen:

$array1 = array("g" => "green", "b" => "brown", "bl" => "blue", "sharp"
=> "red");

Når du står på bl = blue vil du gerne kunne hente "b" og "sharp" med
tilhørende indhold?

> Den mulighed jeg kan se, består i:
>
> 1. Gennemløb arrayet og tilføj nummeret på én eller anden måde
> (f.eks. til en streng hvorfra det senere kan eksploderes)

Det lyder som en ret grim løsning, og nummeret ville blive besværligt at
søge på. En anelse pænere ville det være at gennemløbe og lave values om
til arrays, hvor den ene værdi er den gamle value, og den anden værdi er
nummeret, men det er stadig ret besværligt at søge sig frem til
foregående og næste.

> 2. Opret et simpelt array med array_keys().

Det forstår jeg ikke helt hvordan du vil klare med 1 simpelt array,
medmindre du kun skal bruge value, og altså ikke key.

> 3. Når man har fat i et element, findes nummeret, og så kan man
> finde naboerne ved at justere nummeret og finde den nødvendige
> nøgle i hjælpearrayet.

Hænger din 2. og 3. sammen, eller hvilket nummer taler du om her?

Hvis man opretter to hjælpearrays, et til keys, og et til values, kan
man let finde foregående og efterfølgende key=>value sæt når man står på
den aktuelle post.

Jeg kunne finde på at lave et nested array:

array(
0 => array('g'=>'green'),
1 => array('b'=>'brown'),

osv. Men jeg ved ikke hvad du skal bruge det til, og dermed hvor meget
det komplicerer processen med at finde ret post i arrayet. Generelt
lyder det som om data er struktureret lidt upraktisk fra starten.

> Der er ikke tale om et gennemløb hvor man på forskellige måder
> ville kunne benytte en tæller (men selv da ville man behøve
> hjælpearrayet og omvejen).

Njah, ikke helt, hvis man laver et gennemløb med foreach() og ved hver
iteration gemmer sættet i en variabel, $previous, som først overskrives
når næste har vist sig ikke at være $searchedFor. Når $searchedFor er
sat breakes der ikke, men køres videre. I næste iteration registrerer
scriptet at $searchedFor er sat, og kan nu sætte $next samt stoppe løkken.

Mvh

Jesper Brunholm


Bertel Lund Hansen (04-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 04-01-07 14:29

Jesper Brunholm skrev:

> Det lyder som en ret grim løsning

Absolut.

>> 2. Opret et simpelt array med array_keys().

> Det forstår jeg ikke helt hvordan du vil klare med 1 simpelt array,
> medmindre du kun skal bruge value, og altså ikke key.

Array1 er det originale, array2 er en liste over keys fra array1.
Løbenummer tilføjes til elementerne i array1.

Hvis jeg har fat i array1['pic1234'], kan jeg udlede $nr, slå
$key=array2[$nr-1] op og derefter array1[$key] (tilsvarende med
$nr+1).

> Hænger din 2. og 3. sammen, eller hvilket nummer taler du om her?

1. 2. og 3. er tre trin til samme løsning.

> det komplicerer processen med at finde ret post i arrayet. Generelt
> lyder det som om data er struktureret lidt upraktisk fra starten.

Data er givet på forhånd, leveret som et regneark som jeg
konverterer til CSV-format.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Arne Feldborg (05-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 05-01-07 00:21

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Thu, 4 Jan 2007
14:29:17 +0100


>Data er givet på forhånd, leveret som et regneark som jeg
>konverterer til CSV-format.
>
Det er muligt, at jeg har misforstået spørgsmålet. I så fald bedes du
undskylde. Jeg er bare en smule nysgerrig.

Hvad er pointen i at indlæse det i et associativt array fremfor i et
array med numeriske nøgler.?

Og hvordan får du udvalgt den første nøgle, som du skal kunne gå
henholdsvis frem og tilbage fra, når du ikke kender nøglerens navne
(hvis du gjorde det, ville dit problem jo ikke eksistere).?

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Bertel Lund Hansen (05-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-01-07 01:39

Arne Feldborg skrev:

> Hvad er pointen i at indlæse det i et associativt array fremfor i et
> array med numeriske nøgler.?

Data er beskrivelser af billeder, og de er givet ved et filnavn.
Derfor. Programmet er i øvrigt et diasshow.

Filnavnet kan beregnes ud fra et billednummer som findes i
regnearket, men da ikke alle billeder er digitaliserede, er der
ikke et billede til hvert nummer, og somme tider heller ikke en
post til et givet nummer. Derfor fungerer en logisk talnøgle
ikke.

> Og hvordan får du udvalgt den første nøgle, som du skal kunne gå
> henholdsvis frem og tilbage fra, når du ikke kender nøglerens navne
> (hvis du gjorde det, ville dit problem jo ikke eksistere).?

Jeg genererer navnet.

Foregående og næste skal bruges ved navigation på
enkeltbilledsiden.

I øvrigt har jeg en løsning kørende lavet ud fra de principper
jeg beskrev (et ekstra array). Jeg regner med at bruge noget af
Jesper Brunholms idé med at generere disse links i
initialiseringen og klistre dem på datastrengen i det primære
array. Så kan jeg undvære ekstraarrayet og opslaget deri.

Billederne er private så I kan ikke få et link til projektet.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Arne Feldborg (05-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 05-01-07 02:06

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Fri, 5 Jan 2007
01:39:01 +0100


>Filnavnet kan beregnes ud fra et billednummer som findes i
>regnearket, men da ikke alle billeder er digitaliserede, er der
>ikke et billede til hvert nummer, og somme tider heller ikke en
>post til et givet nummer. Derfor fungerer en logisk talnøgle
>ikke.
>
Muligvis fordi det er sidst på dagen. Men det der fatter jeg ikke en
brik af. Hvis du selv læser det ind fra en csv-fil, så har du da også
selv fuld kontrol over, hvad du vil definere og hvordan.

Hvorfor ikke bare læse det ind i et flerdimensionelt array, hvor du har
en (fortløbende) talværdi som nøgle, og så det du læser ind som poster
i to niveauer.


>> Og hvordan får du udvalgt den første nøgle, som du skal kunne gå
>> henholdsvis frem og tilbage fra, når du ikke kender nøglerens navne
>> (hvis du gjorde det, ville dit problem jo ikke eksistere).?
>
>Jeg genererer navnet.
>
Øh.?

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Bertel Lund Hansen (05-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-01-07 02:21

Arne Feldborg skrev:

> Muligvis fordi det er sidst på dagen. Men det der fatter jeg ikke en
> brik af. Hvis du selv læser det ind fra en csv-fil, så har du da også
> selv fuld kontrol over, hvad du vil definere og hvordan.

Ja, men nu var jeg startet med en simpel version.

>>> Og hvordan får du udvalgt den første nøgle

Frimærkerne på oversigtssiden er links til de store billeder, og
når de skal vises, skal data stå ved siden af. Derfor er
filnavnet en smart nøgle fordi det jo også er 'nøglen' til
billederne. Da man kan klikke på et vilkårligt frimærke, kan man
ramme ind et vilkårligt sted i arrayet.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Arne Feldborg (05-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 05-01-07 03:01

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Fri, 5 Jan 2007
02:21:17 +0100


>Frimærkerne på oversigtssiden er links til de store billeder, og
>når de skal vises, skal data stå ved siden af. Derfor er
>
Altså:
Der er en oversigtsside med Tumbmails, hvorfra man kan vælge et billede.
På selve visningssiden skal man så desuden kunne vælge at gå frem og
tilbage.
Jammen, er det ikke ca. sådanne alle billedgallerier virker.?


>filnavnet en smart nøgle fordi det jo også er 'nøglen' til
>billederne. Da man kan klikke på et vilkårligt frimærke, kan man
>ramme ind et vilkårligt sted i arrayet.
>
Filnavnet er *ikke* en nøgle (ihvertfald ikke en smart een), det er en
værdi.

Det eneste smarte er allerede ved indlæsningen at skabe et array med
fortløbende numeriske nøgler, og så lægge alle andre oplysninger som
værder til disse nøgler.


--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Bertel Lund Hansen (05-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-01-07 10:03

Arne Feldborg skrev:

> Filnavnet er *ikke* en nøgle (ihvertfald ikke en smart een), det er en
> værdi.

En nøgle i databaseteori skal være unik, og der skal være præcis
én pr. element. De betingelser opfylder filnavnet.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Jesper Brunholm (05-01-2007)
Kommentar
Fra : Jesper Brunholm


Dato : 05-01-07 14:56

Bertel Lund Hansen skrev:
>> det komplicerer processen med at finde ret post i arrayet. Generelt
>> lyder det som om data er struktureret lidt upraktisk fra starten.
>
> Data er givet på forhånd, leveret som et regneark som jeg
> konverterer til CSV-format.

Så ville jeg helt afgjort lave et miniprogram til at konvertere CSV data
til en MySQL database eller lignende, og så bruge databasen ved visninger.

Hvis dette ikke er en mulighed (man har ikke adgang til database eller
lignende), ville jeg trække rækkerne CSV'en ud som arrays med hver sit
id, og tomme arraypositioner til de data som ikke findes.

Mvh

Jesper Brunholm

Martin (05-01-2007)
Kommentar
Fra : Martin


Dato : 05-01-07 15:15

Bertel Lund Hansen wrote:
> Hej alle
>
> Hvordan kommer man fra en post i et array til de to naboer? Det
> er et associativt array der tilgås uden numre.

foreach($array AS $key => $value) {
if(is_array($value)) {
foreach($value AS $key2 => $value2) {
// Sådan du mener?
}
}
}

Arrayet kunne se sådan her ud

$array = array(
"key"=>array("key2"=>"value2")
,"key1"=>"value"
);

Det ville nok være at fortrække at lave den midterste som en funktion,
så man kan blive ved med at loope rundt.
Fx.

function loop_array($array) {
$out = array();
foreach($array AS $key => $value) {
$out[$key]=$value;
}
return $out;
}

Bertel Lund Hansen (05-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-01-07 15:39

Martin skrev:

>> Hvordan kommer man fra en post i et array til de to naboer? Det
>> er et associativt array der tilgås uden numre.

> // Sådan du mener?

Nej.

$infoarray = array (
   'pic0005.jpg' => 'Dette er er billede 5',
   'pic0007.jpg' => 'Dette er er billede 7',
   'pic0023.jpg' => 'Dette er er billede 23',
);

// Midt inde i koden:

$picname='pic0007.jpg';
$info= $infoarray[$picname];

Hvordan finder jeg nu let infostrengene fra de to naboer?

Min nuværende løsning består i at registrere naboerne og føje dem
til posterne i det gennemløb som jeg skal have under alle
omstændigheder. Det dannede array gemmes i en sessionvariabel.

Nu vil jeg overveje om løsningen med at generere et veldesignet
array kan komme til at tage for lang tid. Når alt engang er
klart, vil der være mellem 8'000 og 10'000 poster, og det skal jo
ikke tage for lang tid at åbne startsiden.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Martin (05-01-2007)
Kommentar
Fra : Martin


Dato : 05-01-07 16:31

Bertel Lund Hansen wrote:
> Martin skrev:
>
>
>>>Hvordan kommer man fra en post i et array til de to naboer? Det
>>>er et associativt array der tilgås uden numre.
>
>
>> // Sådan du mener?
>
>
> Nej.
>
> $infoarray = array (
>    'pic0005.jpg' => 'Dette er er billede 5',
>    'pic0007.jpg' => 'Dette er er billede 7',
>    'pic0023.jpg' => 'Dette er er billede 23',
> );

foreach($infoarray AS $img => $title) {
echo "<a href='".$img."' title='".$title."'/>";
}

>
> // Midt inde i koden:
>
> $picname='pic0007.jpg';
> $info= $infoarray[$picname];

echo array_values($picname);
// Du skal nok lige lave et tjek først ellers får du en warning

if(array_key_exists($picname)) echo array_values($picname);

Sådan? :)

Martin (05-01-2007)
Kommentar
Fra : Martin


Dato : 05-01-07 16:36

Martin wrote:
> Bertel Lund Hansen wrote:
>
>> Martin skrev:
>>
>>
>>>> Hvordan kommer man fra en post i et array til de to naboer? Det
>>>> er et associativt array der tilgås uden numre.
>>
>>
>>
>>> // Sådan du mener?
>>
>>
>>
>> Nej.
>>
>> $infoarray = array (
>> 'pic0005.jpg' => 'Dette er er billede 5',
>> 'pic0007.jpg' => 'Dette er er billede 7',
>> 'pic0023.jpg' => 'Dette er er billede 23',
>> );
>
>
> foreach($infoarray AS $img => $title) {
> echo "<a href='".$img."' title='".$title."'/>";
> }
>
>>
>> // Midt inde i koden:
>>
>> $picname='pic0007.jpg';
>> $info= $infoarray[$picname];
>
>
> echo array_values($picname);
> // Du skal nok lige lave et tjek først ellers får du en warning
>
> if(array_key_exists($picname)) echo array_values($picname);

Hov glemte lige at anføre hvilket array der skal kigges i - og en mindre
forglemmelse.

if(array_key_exists($picname,$infoarray))
echo array_values(array_key($infoarray,$picname));

PS: Det er ikke testet, og lidt langtid siden jeg har leget med arrays,
så det er taget ud fra reminderen.

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste