Autor Zpráva
Duchaplny
Profil
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
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 />";}
?>
Výsledok:
8:00
8:30
9:00
9:30
10:30
11:00
11:30
12:30
13:00
13:30
14:00
Neviete ako vyriešim tie 2 hod. rezervy medzi termínmi ?


abc:
Funguje to výborne. Zrejme použijem tento tvoj script, bo ten môj sa mi aj tak nedarí dotiahnuť, ďakujem.
Micruss
Profil
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
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
Duchaplny:
Ad array_splice:
To stejné, co udělá ten for, tak udělá array_splice($test, $t, 4)
Jan Tvrdík
Profil
abc:
Ne tak úplně, array_splice nezachovává numerické klíče.
Duchaplny
Profil
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
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.

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: