Diskuze: mimo array
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, zkus ten kód uvést do značky "Vložit zdrojový kód" (nad textarea hned druhá ikonka), pak ti někdo dokáže poradit.
Je drobnost ohledně návrhu - mezi třídou Autor a Parkoviste může být obousměrná 1:N vazba. Tedy Auto může mít objekt $parkoviste jako atribut a v momentě zavolání $auto->vjedNaParkoviste($parkoviste) se objekt k autu uloží. Tím uchováš stav auta, že je aktuálně na parkovišti. Při výjezdu pak není nikde potřeba předávat objekt $parkoviste, protože auto v jednu chvíli může (logicky) být jen na jednom parkovišti, a jelikož si jeho instanci uchovává v sobě, ví, od kterého parkoviště má odjet
https://www.tutorialspoint.com/…ormatter.htm + tlacitko code </>
<?php
require 'tridy/Auto.php';
require 'tridy/Parkoviste.php';
$parkoviste = new Parkoviste(5);
$auto1 = new Auto('ADT-25-68', 'červená');
$auto2 = new Auto('KOE-52-31', 'zelená');
$auto3 = new Auto('JNA-36-55', 'bílá');
$auto4 = new Auto('BAN-11-73', 'modrá');
$auto5 = new Auto('ZAZ-32-92', 'žlutá');
$auto6 = new Auto('RUR-74-54', 'černá');
$auto7 = new Auto('LOL-23-52', 'hnědá');
$auto1->vjedNaParkoviste($parkoviste);
$auto2->vjedNaParkoviste($parkoviste);
$auto3->vjedNaParkoviste($parkoviste);
$auto4->vjedNaParkoviste($parkoviste);
$auto5->vjedNaParkoviste($parkoviste);
$auto6->vjedNaParkoviste($parkoviste);
$auto7->vjedNaParkoviste($parkoviste);
$parkoviste->vypisAuta();
echo 'nevesla se ';
$parkoviste->neveslaSe();
echo '';
$auto3->odjezd($parkoviste);
$auto4->odjezd($parkoviste);
$parkoviste->vypisAuta();
?>
<?php
class Auto {
private $spz;
private $barva;
public function __construct($spz, $barva) {
$this->spz = $spz;
$this->barva = $barva;
}
public function getSpz() {
return $this->spz;
}
public function vjedNaParkoviste($parkoviste) {
$parkoviste->vjezd($this);
}
public function odjezd($parkoviste) {
$parkoviste->vyjezd($this);
}
} < ? phpclass Parkoviste {
private $kapacitaParkoviste;
private $obsazenost = 0;
private $parkoviste = array();
private $bufferAut = array();
public function __construct($kapacita) {
$this->kapacitaParkoviste = $kapacita;
}
private function jeVolno() {
if ($this->kapacitaParkoviste > $this->obsazenost) {
return true;
} else {
return false;
}
}
public function vjezd($auto) {
if (Parkoviste::jeVolno()) {
$this->parkoviste[] = $auto;
$this->obsazenost++;
} else {
$this->bufferAut[] = $auto;
}
}
public function vypisAuta() {
$i = 0;
foreach ($this->parkoviste as $p) {
echo $i . ' ' . $p->getSpz() . '
';
$i++;
}
}
public function neveslaSe() {
foreach ($this->bufferAut as $a) {
echo $a->getSpz() . '
';
}
}
public function vyjezd($auto) {
//echo count($this->parkoviste) . '
';
for($i=0; $i<count($this->parkoviste);$i++){
if($auto->getSpz() == $this->parkoviste[$i]->getSpz()){
echo $i . '';
unset($this->parkoviste[$i]);
}
}
}
}
';
public function vyjezd($auto) {
//echo count($this->parkoviste) . '
//';
for ($i = 0;$i < count($this->parkoviste);$i++) {
if ($auto->getSpz() == $this->parkoviste[$i]->getSpz()) {
echo $i . '
';
unset($this->parkoviste[$i]);
}
}
}
}
No, a kdyz unsetnes z parkoviste neco, tak se zmeni pocet prvku v array,
znovu se prepocita count a nebudou ti sedet indexy.
x = array(1,2,3,4,5)
count(x) = 5
i = 2 -> x[i] = 3
unset(x[i]) // x=array(1,2,4,5)
count(x) = 4
i++ -> i = 3 -> x[i] = 5
Auto 4 jsi uplne vynechal.
A pravdepodobne kvuli tomu ti zlobi i dalsi veci.
Mimochodem, na odradkovani muzes pouzit "\n" nebo '\n'.
Ahoj, díky za typy. Na předání reference do atributu se podívám. Díky. Nicméně jse metodu přepracoval takhle:
public function vyjezd($auto) {
if (($key = array_search($auto->getSpz(), $this->parkoviste)) !== false) {
unset($this->parkoviste[$key]);
}
}
Ale stejně jsem v koncích...neprojdu přes podmíku. Už mi to nejde do hlavy. Díky za rady. A zdar.
Ahoj, dali jsme to s kamosem dohromady. Kdyby to nekoho zajimalo a nebo to nekdy nekomu pomohlo, tak tady:
public function vyjezd($auto){
foreach($this->parkoviste as $n => $a){
if($a->getSpz() == $auto->getSpz()){
unset($this->parkoviste[$n]);
echo $auto->getSpz() . " odjelo<br>";
$this->obsazenost--;
break;
}
}
return $this->parkoviste;
}
Konstrukci " foreach($this->parkoviste as $n => $a){" jsme neznal a v tom je byl ten hacek. Mozna by stalo doplnit do serialu.
Foreach neni dulezite, ale to, ze pri unsetovani musis postupovat od konce. Ne i++ a i<len ale i-- a i>=0.
Diky Petere,
to mi nedoslo. Tak jsem to prepracoval.
public function vyjezd($auto){
for($i = $this->obsazenost-1; $i>=0; $i--){
if($this->parkoviste[$i]->getSpz() == $auto->getSpz()){
unset($this->parkoviste[$i]);
echo $auto->getSpz() . " odjelo<br>";
break;
}
}
$this->obsazenost;
}
Zobrazeno 8 zpráv z 8.