Autor | Zpráva | ||
---|---|---|---|
Duchaplny Profil |
#1 · Zasláno: 30. 10. 2013, 23:22:21
Zdravím,
rád by som vedel, či je možné vybrať určité pozície z array , a odstrániť ich ? Snažím sa spraviť objednávkový kalendár, a v prípade, že sa niekto objedná dajme tomu na 10:00, tak ďalšie 4 termíny, vrátane toho o 10:00, potrebujem zrušiť z výberu, aby sa ďalšia objednávka mohla uskutočniť až o 2 hodiny, t.j. o 12:00.
Array: <?php $test=Array(1=>"8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00"); ?> Princíp je jednoduchý výber z roletového menu (select, option), následný zápis do DB. V zápise si ešte nie som istý, či mám použiť pevný čas, ktorý bol vybraný (10:00) alebo len jeho pozíciu (5) z array. Každopádne to záleží od toho, akým spôsobom sa budú odstraňovať tie súvisiace 4 termíny z výberu, a to je práve tá časť, ktorú neviem vyriešiť. Nejaké nápady ? |
||
Micruss Profil |
Takhle pozdě večer mě napadá jen toto:
<?php $test=Array(1=>"8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00"); $value = "10:00"; $arr_key = array_search($value, $test) + 1; echo "<select>"; for($i=$arr_key; $i<=count($test); $i++) { echo '<option value="'.$test[$i].'">'.$test[$i].'</option>'; } echo "</select>"; # nebo pomocí unset kterej vymaže z pole ty časy ta -1 tam je kvůli tomu že u 1. příkladu jsme ji přičetli for($i=1; $i<=($arr_key-1); $i++) { unset($test[$i]); } var_dump($test); ?> ale možná je elegantnější řešení :) |
||
Tori Profil |
Většinou se snažím vyhnout řešením závislým na JavaScriptu, ale tady by to bylo zrovna lepší: Mám kalendář, kliknu na datum, AJAXem se ze serveru načtou volné časy a z nich se vyrobí select (anebo se načte už hotový HTML kód selectu). Kliknu na jiný den a select se aktualizuje. Serverová část = mám pole použitelných termínů (třeba to, co je v [#1]), v
$_GET dostanu vybraný datum, podle něj najdu v DB všechny rezervace pro tento datum. Z pole použitelných termínů odstraním ty, které jsou už rezervované a pošlu zbývající volné termíny zpátky.
|
||
abc Profil |
Já bych to řešil rovnou při výpisu.
Z DB si vytáhnout časy rezervací a následně 4x vynechat. To lze třeba takto. Ale taky bych to ve finále asi řešil jinak, už jsem dost unaven. Mimochodem to pole jde po půl hodinách od 8 do 14, to lze také v cyklu $hodiny = Array(1 => "8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00"); $cas_rezervace = "10:00"; //z DB $vynechat = 4; $vynechat_od = array_search($cas_rezervace, $hodiny); $vynechat_do = $vynechat_od + $vynechat; foreach ($hodiny as $key => $value) { if ($key < $vynechat_od || $key > $vynechat_do) { echo $value . "<br>"; } } |
||
1Pupik1989 Profil |
Já bych z db vytáhnul casy co jsou rezervované a přidal to k nejbližšímu dalšímu následujícímu nebo předchozímu a vrátil info o čase.
Abych to uvedl v pravou míru. Chic čas 15:00 V databázi už jsou 14:00, 15:00,16:00. No a já mu nabídnu termíny 14:30 a 15:30. Uživatel si zvolí sám. |
||
Duchaplny Profil |
Micruss:
Tvoje riešenie odstráni všetky časy do 10:00, toto by sa mohlo hodiť, keby sa niekto objednal napr. na 9:00, bo je jasné, že od 8:00 do 9:00 už nič nestihnem. Tori: Nad týmto som uvažoval, ale nechcem to zbytočne komplikované, stačí len odstrániť tie časy z toho poľa, aby ich pri výpise nebolo vidno. Skrátka jednoduché PHP s min. využitím DB a bez JS. 1Pupik1989: V konečnom výsledku musí byť medzi tými časmi 2 hod. rozdiel, inak by sa to nedalo stíhať. Preto ak bude v DB rezervonaný čas na 14:00, tak až do 16:00 nemôžem prijímať ďalšie objednávky. abc: Tento nápad sa mi pozdáva, trochu sa s tým scriptom pohrám a bude to presne to, čo si predstavujem. Akurát neviem ako to vyriešiť, keď tých rezervácii bude viac. Tento príklad rieši 1 rezerváciu, ako to spraviť pre viacero ? |
||
abc Profil |
Opět ne úplně dokonalý kód, jsem poslední 2 dny maličko mimo...
Přidal jsem si tam jednu proměnnou, která se nastaví, když se najde shoda. Pak se bude navyšovat spolu s další iterací, a když se dostane na počet rezervací, které se mají vynechat, tak se zase zruší. $hodiny = Array(1 => "8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00"); $casy_rezervaci = array("8:00", "12:00"); $vynechat = 4; foreach ($hodiny as $key => $value) { if (isset($i) && $i < $vynechat) { $i++; continue; } if (isset($i) && $i == $vynechat) { unset($i); } $shoda = array_search($value, $casy_rezervaci); if ($shoda !== FALSE) { $i = 1; continue; } echo $value . '<br>'; } |
||
Duchaplny Profil |
#8 · Zasláno: 31. 10. 2013, 22:31:14 · Upravil/a: Duchaplny
Skúšal som niečo takéto:
<?php $test=Array(1=>"8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00"); $termin=array(5,9); // z DB -> niekto sa objedná na 10:00 (5) a 12:00 (9) foreach ($termin as $t) {unset($test[$t]);} foreach ($test as $terminy) {echo $terminy."<br />";} ?> 8:00 8:30 9:00 9:30 10:30 11:00 11:30 12:30 13:00 13:30 14:00 abc: Funguje to výborne. Zrejme použijem tento tvoj script, bo ten môj sa mi aj tak nedarí dotiahnuť, ďakujem. |
||
Micruss Profil |
#9 · Zasláno: 31. 10. 2013, 23:25:47
já mylel, že je chceš smazat ale asi sem to špatně pochopil...
ďalšie 4 termíny, vrátane toho o 10:00, potrebujem zrušiť z výberu, |
||
abc Profil |
#10 · Zasláno: 31. 10. 2013, 23:30:10
Zprovoznil jsem ti ten tvůj skript.
Je třeba z pole zrušit rezervovaný + 3 následující klíče... $test = Array(1 => "8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00"); $termin = array(5, 9); // z DB -> niekto sa objedná na 10:00 (5) a 12:00 (9) foreach ($termin as $t) { for ($i = $t; $i < $t + 4; $i++) { unset($test[$i]); } } foreach ($test as $terminy) { echo $terminy . "<br />"; } |
||
Jan Tvrdík Profil |
Duchaplny:
„rád by som vedel, či je možné vybrať určité pozície z array , a odstrániť ich ?“
Doplním, že přesně tohle lze provést pomocí funkce array_splice. |
||
Duchaplny Profil |
Micruss:
zrušiť z výberu, aby tam proste neboli v ponuke. Jan Tvrdík: pozeral som túto funkciu, ale nepáči sa mi, že odstráni všetky pozície za udaným číslom. Keby som napr. dal array_splice($test, 5); tak za 10:00 by už nebol žiadny údaj. Zrejme by to šlo nejak nastaviť, keby som sa s tým pohral, ale zdalo sa mi to zbytočne komplikované.
abc: presne toto som chcel urobiť, a celý čas som sa okolo toho motal, dával tam rôzne podmienky a naťahoval kód, pritom stačilo dať for() . A to som myslel, že to vo vnútri foreach() nepôjde. Ďakujem ešte raz, už je to super.
|
||
abc Profil |
#13 · Zasláno: 1. 11. 2013, 00:24:08
|
||
Jan Tvrdík Profil |
abc:
Ne tak úplně, array_splice nezachovává numerické klíče. |
||
Duchaplny Profil |
#15 · Zasláno: 2. 11. 2013, 12:50:32
abc:
nechová sa to úplne tak isto. V tomto prípade to z $termin = array(5, 9); nevezme 10:00, ale až 10:30 a nevezme to 4 termíny, ale 5, čiže 10:30, 11:00, 11:30, 12:00, 12:30 a array "9" je termín až od 15:00..
Jan Tvrdík: neviem presne čo to znamená. |
||
1Pupik1989 Profil |
#16 · Zasláno: 2. 11. 2013, 14:56:30
Duchaplny: To znamená, že po smazání 4 prvků se následující prvky posunou o 4 místa doleva. Přes unset se neposunou nikam, jen nebudou definované.
Array_splice bude lepší volba. Nicméně když tak přemýšlím, tak bych na to šel opaćně. Do pole bych ulożil jen rezervované. |
||
Duchaplny Profil |
1Pupik1989:
po smazání 4 prvků se následující prvky posunou o 4 místa doleva aha, už rozumiem, to vysvetľuje, prečo tá 9 už ide ďaleko.. v tom prípade, by som musel používať časy a nie ich pozície.. Nicméně když tak přemýšlím, tak bych na to šel opaćně. Do pole bych uložil jen rezervované tie sa ťahajú z DB a ukladajú do pola $termin . Následne sa vymazávajú z pola $test .
|
||
Časová prodleva: 10 let
|
0