Location: PHPKode > scripts > Calc Hondt > calc-hondt/hondt.php
<?php

/**
 * classe per a calcular els escons a repartir en funció 
 * de la llei d'Hondt.
 *
 * Class to calculate Hondt law
 * 
 *  @author Àlex Corretgé - Serveis Informàtics Corretgé.com SLU - http://corretge.cat/
 */
class calcHondt
{
	/**
	 * Escons que corresponen
	 *
	 * @var Array
	 */
	protected $escons;
	
	
	/**
	 * Inicialitzem l'objecte
	 *
	 * @param integer $nEscons
	 * @param Array $vots
	 */
	public function __construct($nEscons, $vots)
	{
		$this->calc($nEscons, $vots);
	}
	
	/**
	 * Calculem els escons repartits per formació.
	 *
	 * @param integer $nEscons
	 * @param Array $vots
	 */
	protected  function calc($nEscons, $vots)
	{
		
		/**
		 * Apliquem el càlcul de coeficient de la llei d'Hondt.
		 * Els vots de cada formació dividit per tots els escons.
		 */
		$hondt = Array();
		foreach ($vots as $partit => $nVots) 
		{
			for ($i=1; $i <= $nEscons; $i++)
			{
				$hondt[$partit . '::' . $i] = $nVots / $i;
			}
			
		}
		
		/**
		 * Ordenem de major a menor els coeficients resultants
		 * d'aplicar la llei d'Hondt.
		 */
		arsort($hondt);
		
		
		/**
		 * Inicialitzem els escons amb les formacions votades a zero.
		 */
		//$vots = array_fill_keys(array_keys($vots), 0);
		$this->escons = array_combine(array_keys($vots), array_fill(0, count($vots), 0));
		
		/**
		 * Processem el número d'escons a repartir, i el sumem
		 * a l'array escons a la casella de la formació que correspongui.
		 */
		for ($i=1; $i <= $nEscons; $i++)
		{
			$var = each($hondt);
			//echo $var['key'] . " : " . $var['value'] . "<br/>";
			
			/**
			 * Trobem el partit en la sèrie Partit::NumEscò
			 */
			$trobaPartit = preg_match("/^([\w_-çÇ]*)\:\:.*$/", $var['key'], $partit);
			if ($trobaPartit)
			{
				$this->escons[$partit[1]]++;
			}
			else 
			{
				die("Partit no trobat, revisar RegExp :" . $var['key']);
			}
		}

		/**
		 * Debug
		 *
		echo "<h3>Tots els coeficients</h3>";
		var_dump($hondt);
		/**
		 */
		
	}
	
	
	/**
	 * Renderitzem la sortida dels escons calculats
	 *
	 * @return string
	 */
	public function Render()
	{
		
		$ret = "<table>";
		
		foreach ($this->escons as $partit => $escons) 
		{
			$ret .= "<tr><td>$partit</td><td>$escons</td></tr>";
		}
		
		$ret .= "</table>";
		
		return $ret;
	}
}

?>
Return current item: Calc Hondt