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-24 12:45

Jag har en mycket stor array i PHP som jag delvis vill travarsera genom. För att kunna göra det effektivt behöver jag sätta array:ens interna pekaren till ett visst element som jag har nyckeln till. Är det möjligt?

etanders 2008-03-24 13:59

Verkar som man får använda reset(), end(), next(), prev(), current() och key().
Måste du använda den interna pekaren?

kullervo 2008-03-24 15:21

Det låter som att du inte tänkt igenom det tillräckligt. Förklara gärna om du faktiskt har en lösning. Givetvis kan jag scanna igenom arrayen från början tills jag hittar elementet med rätt nyckel, men poängen med hela den här tråden var att jag inte vet om/hur man kan göra det effektivt.

Magnus_A 2008-03-24 20:29

Lånar lite om det ursäktas och undrar om det finns ett bra sätt att loopa igenom en matris med start från valfri plats och loopa igenom hela matrisen, inte bara det som är kvar av den.

elofsson 2008-03-24 20:34

Citat:

Originally posted by Magnus_A@Mar 24 2008, 21:29
Lånar lite om det ursäktas och undrar om det finns ett bra sätt att loopa igenom en matris med start från valfri plats och loopa igenom hela matrisen, inte bara det som är kvar av den.
Fungerar det inte att köra två loopar? Först sista halvan som återstår och sedan efter det i loop nummer två första halvan?

etanders 2008-03-24 21:07

kullervo: Det verkar ju inte som om det finns något sätt att flytta den interna pekaren med php-funktioner utöver de jag nämnde tidigare.

Jag antar att nycklarna i din array är något annat än rena index, annars vore det ju en smal sak att loopa från valfri startposition. Vet inte var arrayen "kommer ifrån", men en idé kanske kan vara att använda dubbla arrayer så att

$originalArray[$key] = $value

översätts till

$newArray1[$key] = $index
$newArray2[$index] = $value

där $index är stigande heltal. Vill du loopa igenom arrayen med start vid elementet med nyckeln $key blir det ju något i stil med

Kod:

$elementCount = count($newArray2);
for ($i = $newArray1[$key]; $i < $elementCount; $i++) {
  doSomething($newArray2[$i]);
}

Om detta överhuvudtaget lönar sig jämfört med att loopa sig igenom arrayen med next() etc. beror ju lite på hur du skapar arrayen från början. Det är ju självklart ingen vits att loopa igenom hela arrayen bara för att skapa den heltalsindexerade arrayen... ;)

kullervo 2008-03-24 22:41

etanders:
Visst är alla sätt som löser problemet, hur hackiga dom än är, av intresse men det jag letar efter i första hand är lösningen för det generella problemet. PHP kan göra det här internt men det verkar vara omöjligt att göra det med PHP-kod.

En annan variant av din lösning är att låta arrayen vara en länkad lista, dvs. där varje element också innehåller nyckeln till näst följande element. Det är en enkare och vanligare lösning och således förmodligen ett bättre val.

kullervo 2008-03-24 22:42

Magnus_A:
"loopa igenom en matris med start från valfri plats" (effektivt) är ju precis det jag vill göra.

jimmie 2008-03-24 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.

etanders 2008-03-24 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...


Alla tider är GMT +2. Klockan är nu 06:22.

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