PDA

Pogčedajte punu verziju : Kako naci prethodni i sledeci element asocijativnog niza?


Pedja
26. 07. 2007., 22:23
Ima cudan problem, tj. ocekivao sam da PHP to radi ali ne mogu da iskopam kako.

Imam asocijativni niz koji je uz to i visedimenzioni. Imam vrednost indexa jednog elementa niza i treba da nadjem koji je prethodni i sledeci element tog niza.

Ocigledan nacin, da rucno protrcim kroz nis i nadjem mi se cini kao spor metod.

Neverovatno mi je da php nema funkciju kojom moze da se setuje tekuci slog u nizu.

dee
26. 07. 2007., 22:57
http://www.php.net/manual/en/function.next.php

srdjevic
26. 07. 2007., 23:06
Samo, u ovom slucaju moras prvo da se pozicioniras na njega. A sto jednostavno ne odradis array_keys + array_search + ( i-1 || i+1 ) kombinaciju?

Pedja
26. 07. 2007., 23:06
Pa dobro, nisam bas toliki duduk :)

Ne radi to ono sto mi treba. Problemje sto imam id indeksa ali to nije tekuci slog u nizu. next() radi samo sa tekucim, a nema funkcije kojom se moze podesiti koji je slog tekuci.

marinowski
26. 07. 2007., 23:19
Čekaj, da li je asocijativni niz uopšte poređan? Po definiciji nije.

Tako da traženje prethodnog i narednog člana nema baš nekog smisla.

zira
26. 07. 2007., 23:28
Kao sto rece srdjevic, radis sa array_keys i dalje sta ti treba i kako hoces

Pedja
27. 07. 2007., 00:23
Niz jeste poredjan, samo kljuc uredjivanja nije indeks.

Ovo sa array_keys bi radilo, ali mi se cini da ne bi bio nista optimalnije nego da odmah trazim u pocetnom nizu.

ivanhoe
27. 07. 2007., 03:55
nije ti dobra struktura podataka za to sto ti treba.. asocijativni nizovi nisu predvidjeni za sekvencijalni pristup, znaci jedino optimalno resenje je da svaki elelement niza pamti key od sledeceg elementa (ili referencu na sledeci element). Sva ostala resenje zahtevaju da prolazis kroz ceo niz, ovako ili onako..

Pedja
27. 07. 2007., 09:52
Niz je sasvim ok nacin da uradim ovo sto sam namerio, i PHP ima svu potrebnu funkcionalnost, osim sto mu nedostaje funkcija kojom mogu da podesim tekuci element niza. Veza, prethodno-sledeci izmedju elemenata niza postoji i funkcionise bas kako treba.

Ilija Studen
27. 07. 2007., 10:00
Iz user notes za array funkcije:

function setPointer(&$array, $set_key) {
if (!is_array($array)) {
trigger_error('$array must be an array', E_USER_ERROR);
}

if (!array_key_exists($set_key, $array)) {
trigger_error('$set_key must exist in $array', E_USER_ERROR);
}

reset($array);

while ($set_key != key($array)) {
next($array);
}
}

Nije baš najelegantnije rešenje, ali eto...

robi-bobi
27. 07. 2007., 10:01
to sto ti ivanhoe kaze ima itekako smisla - naprawi neku svoju strukturu
array (
1 => array (
data => sta god oces
prev => null
next => 3
)
)
na ovaj nacin mozes da radis veoma lako razne operacije tipa premesti poslednja 10 elementa da budu odmah iza 12.og elementa i sl

dee
27. 07. 2007., 11:00
nije ti dobra struktura podataka za to sto ti treba.. asocijativni nizovi nisu predvidjeni za sekvencijalni pristup, znaci jedino optimalno resenje je da svaki elelement niza pamti key od sledeceg elementa (ili referencu na sledeci element). Sva ostala resenje zahtevaju da prolazis kroz ceo niz, ovako ili onako..

sto ce reci:
http://en.wikipedia.org/wiki/Linked_list

ivanhoe
27. 07. 2007., 16:56
a mozes i da sortiras niz po tom indexu koji koristis, onda ce ti next() raditi kako se ocekuje, samo je pitanje koliko je sortiranje efiaksno.. svakako je sporije od pristupa sa ulancanom listom

Pedja
28. 07. 2007., 00:49
Ovako sa petjom sam i uradio, a pitao sam ima li ko ideju za nesto bolje :)

Ma ne treba mi sortiranje, premestanje i ostale kerefeke, samo mi treba da na osnovu tekuceg elementa niza, mogu da vidim koji je prethodni i sledeci. Php to vec sve sam radi, samo ne ume da namesti tekuci elemen na neki koji ja izaberem :)