WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Sätta array-pekare i PHP (https://www.wn.se/forum/showthread.php?t=28137)

kullervo 2008-03-25 00:04

Citat:

Originally posted by jimmie@Mar 24 2008, 23:06
array_slice kanske kan fungera? Dvs. plocka ut den delen av arrayen som är intressant och därmed få ditt startelement först i arrayen och sedan loopa igenom.
http://se2.php.net/manual/en/function.array-slice.php
Man ska dock komma ihåg att en array i PHP inte är någon array egentligen utan en hastabell om man tittar på PHPs interna representation av hur arrayen lagras.

Tyvärr känner jag inte till vilken plats i arrayen elementet den ska börja med har. Jag antar att PHP internt håller koll på ordningen av elementen med en dubbellänkad lista och sådana fall går det åt många cykler bara att stega fram till offset:en för array_slice() vilket är precis det jag vill undvika.

Jag sitter inte och idiotoptimerar små droppar i havet utan tycker att det här problemet är intressant ur ett akademiskt perspektiv. Tanken slog mig när jag funderade på att faktiskt göra precis det här med mycket stora array:er.

kullervo 2008-03-25 00:09

Citat:

Originally posted by etanders@Mar 24 2008, 23:50
För en något generellare lösning hade jag nog valt att skriva en klass med sådana egenskaper att den uppfyllde de specifikationer jag hade, eftersom php uppenbarligen inte har någon inbyggd funktion för just detta.
Det finns ju ett antal standard-datastrukturer att utgå ifrån. Länkad lista är en, kanske skulle en dubbellänkad lista vara att föredra beroende på hur generellt det ska vara. Problemet med länkad lista är ju att det inte går att gå direkt till ett element mitt i listan utan att stega igenom alla föregående element och det var väl ungefär detta du ville undvika, så jag skulle inte valt en ren länkad lista...

...eller så skriver man en oneliner istället för en hel klass. Åter igen så är jag bara intresserad av att göra det här effektivt utan att slänga bort mängder med klockcykler i onödan.

etanders 2008-03-25 07:45

För att kunna loopa igenom datamängden när startelementet väl är funnet behövs antingen en referens till nästföljande i varje element (som en länkad lista) eller ett heltalsbaserat index för direktåtkomst (som i en klassisk array). För att hitta startelementet (med känd nyckel enligt din första post) behövs någon form av hashtabell/map/dictionary.

Så för att göra det du efterfrågar ser det ut som om dessa principer behöver kombineras till en ny datastruktur, t.ex. en klass med implementation inspirerad av mitt första svar i denna tråd. Något bättre rent generellt kan jag inte komma på just nu. Beroende på exakt vad man vill åstadkomma och varifrån arrayen kommer går det kanske att förbättra det något.

kullervo 2008-03-25 11:57

Citat:

Originally posted by etanders@Mar 25 2008, 07:45
För att kunna loopa igenom datamängden när startelementet väl är funnet behövs antingen en referens till nästföljande i varje element (som en länkad lista) eller ett heltalsbaserat index för direktåtkomst (som i en klassisk array). För att hitta startelementet (med känd nyckel enligt din första post) behövs någon form av hashtabell/map/dictionary.

Så för att göra det du efterfrågar ser det ut som om dessa principer behöver kombineras till en ny datastruktur, t.ex. en klass med implementation inspirerad av mitt första svar i denna tråd. Något bättre rent generellt kan jag inte komma på just nu. Beroende på exakt vad man vill åstadkomma och varifrån arrayen kommer går det kanske att förbättra det något.

PHP håller redan koll på nästa och föregående element.


Alla tider är GMT +2. Klockan är nu 19:49.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson