<pre>
<?php
class Ware{
protected string $name;
protected int $gewicht;
public function __construct(string $iName, int $iGewicht){
$this->name = $iName;
$this->gewicht = $iGewicht;
}
public function getName() :string{return $this->name;}
public function getGewicht() :int{return $this->gewicht;}
}
class Lkw
{
protected int $maxGewicht= 0;
protected $stack = array();
public function __construct(int $iMaxGewicht = 40000){ $this->maxGewicht = $iMaxGewicht;}
public function getStack() :array{ return $this->stack;}
/**
* Lädt eine einzelen Ware
* @param Ware $iWare
* @return int Restmenge, die kein Platz hatte
*/
protected function addToStack(Ware $iWare) :int{
$rest = 0;
$platz = $this->maxGewicht - $this->getGesammtGewicht();
if($platz >= $iWare->getGewicht()){
$this->stack[] = $iWare;
}else{
$this->stack[] = new Ware($iWare->getName(), $platz);
$rest = $iWare->getGewicht() - $platz;
}
return $rest;
}
public function getGesammtGewicht(){
return array_reduce($this->stack, function($sum, $ware){
$sum += $ware->getGewicht();
return $sum;
});
}
/**
* Fügt eine Liste von Waren in den LKW und gibt eine Liste mit den Restwaren die kein Platz hatten zurück
* @param array<Ware> $iWaren
* @return array<Ware>
*/
public function beladen(array $iWaren) :array{
$restWaren = $iWaren;
//Abarbeiten bis entweder keine Waren mehr da sind oder der LKW voll ist.
do {
$ware = array_shift($restWaren); //Erste Ware herausnehmen
if(is_null($ware)) break; //Wenn nix mehr im Stack war, abbrechen
$restGewicht = $this->addToStack($ware); //Ware in den LKW laden
//Wenn ein Rest bleibt, dann den Rest wieder an den ANfang der Liste setzen
if($restGewicht > 0) array_unshift($restWaren, new Ware($ware->getName(), $restGewicht));
} while($restGewicht == 0);
return $restWaren;
}
public function entladen(){$this->stack = array();}
}
$waren = array();
$waren[] = new Ware("Bier", 35000);
$waren[] = new Ware("Schnaps", 7000);
$waren[] = new Ware("Tabak", 1500);
$lkw = new Lkw(40000);
$restWaren = $lkw->beladen($waren);
echo("<h3>Alle Waren</h4>");
print_r($waren);
echo("<h3>Waren im LKW</h4>");
print_r($lkw->getStack());
echo("<h3>Restliche Waren</h4>");
print_r($restWaren);
?>
</pre>