Autor Zpráva
4li
Profil
Hi!

Existuje nejaka "sort" funkce, kde bych zadal presne pozadavky na usporadani pole?

Priklad:
Array ( [1] => book-me [2] => online [3] => online [4] => offline [5] => book-me )

Potrebuju:
Array ( [2] => online [3] => online [1] => book-me [5] => book-me [4] => offline )

Pozadavky
- online vzdy na zacatku
- offline vzdy na konci
- musi to usporadavat ve smyslu, ze nebude menit klice puvodnich hodnot, tj. napr. klic [2] bude met vzdy hodnotu "online"

Dik moc!
HGD
Profil
usort() - řazení dle vlastní fce
4li
Profil
HGD
ok.. dik za radu, ale nemam poneti o tom jak tu funkci sestavit.. muzes to prosim specifikovat?
Mastodont
Profil
usort těžko, když nemají být měněny klíče
This function assigns new keys to the elements in array . It will remove any existing keys that may have been assigned, rather than just reordering the keys.
nightfish
Profil
uasort

jinak jak může vypadat ta porovnávací funkce je v usort() v příkladu č. 1
4li
Profil
nightfish
diky.. vazne se nevyznam ve vytvareni funkci, mohl by jsi mi s tim pomoct?
peta
Profil
:)))
4li proste si zkopiruj prvni priklad. Je to asi 10 radku a pak volani funkce (radek s ***) uasort($arr, 'so');
Pod tim uz je jen vystup.
4li
Profil
peta
skusil som vsetko, ale vazne si neviem s tymto problemom rady.. mam problemi s funkciami vseobecne, preto by som ocenil, ak by mi s tym niekto pomohol viacej, resp. napisal konkretne riesenie..

dik moc!
Alphard
Profil
<?php
$puv = array ( 1 => "book-me", "online", "online", "offline", "book-me");
$new = $puv;

function radit ($a, $b)
{
  if ($a == $b) return 0;
  $vzor = array ("online", "book-me", "offline");
  return (array_search ($a, $vzor) < array_search ($b, $vzor)) ? -1 :1;
}

uasort ($new, "radit");

print_r ($puv);
echo "<br>";
print_r ($new);
?>
vysledek:
Array ( [1] => book-me [2] => online [3] => online [4] => offline [5] => book-me )
Array ( [2] => online [3] => online [1] => book-me [5] => book-me [4] => offline )
4li
Profil
Alphard
diiiiiiiiiiiiiiiiiiiiiiiiiiiiiik moc!
fakci to..
mas to u mna :)
4li
Profil
Alphard
Este raz ti dakujem za pomoc.

Riesim toto iste pole este raz. Aby som sa vratil k povodnemu problemu:

Priklad bol:
Array ( [1] => book-me [2] => online [3] => online [4] => offline [5] => book-me )

Potreboval som to pole zoradit podla vzoru > "online", "book-me", "offline" a tak to funguje podla tvojho riesenia:
Array ( [2] => online [3] => online [1] => book-me [5] => book-me [4] => offline )

Teraz potrebujem, aby takto zoradene pole dostalo novu podmienku a to aby sa vsetky "book-me" zoradili nahodne pri kazdom nacitani, tj.:

1. nacitanie:
Array ( [2] => online [3] => online [1] => book-me [5] => book-me [4] => offline )

2. nacitanie:
Array ( [2] => online [3] => online [5] => book-me [1] => book-me [4] => offline )

atd.

Je to vobec mozne?

Dik moc!
4li
Profil
Nenajde sa nikto, kto by mi v tomto poradil, prosim?
AM_
Profil
zkus Alphardovu funkci radit prepsat takto:

function radit ($a, $b)
{
  if ($a == $b) return rand(0, 1)*2-1; //vrati nahodne 1 nebo -1
  $vzor = array ("online", "book-me", "offline");
  return (array_search ($a, $vzor) < array_search ($b, $vzor)) ? -1 :1;
}

nevím, jaký řadící algoritmus PHP používá, je možné i to, že s použitím této funkce nemusí být konečný. Ale zkusit to můžeš ;)
nightfish
Profil
imho tohle už pomocí usortu() vyřešit nepůjde, důvod popsal AM_ - porovnání dvou prvků není deterministické, a navíc obecně může pokaždé dopadnout jinak...

já bych to zřejmě řešil dvourozměrným polem ve stylu
$pole = array("online" => array(2, 3), "book-me" => array(1, 5), "offline" => array(4));

s tím, že na book-me bych pak zavolal shuffle
4li
Profil
AM_
Dik. Funguje to presne ako ma! :)

nightfish
Tvoja metoda sa mi pozdava viac, ale ak to fakci, tak to zatial nebudem menit.

Dik za pomoc!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: