Ahora ObjetivoPHP en Twitter

Ahora nos puedes seguir desde twitter, @objetivoPHP.

Saludos y espero que incremente la participación en el sitio.

Paginador en PHP versión 3.0.0

Bueno para no realizar otro articulo edito este y pongo la versión 3 del paginador, si bien se agrando un poco, tiene mayor flexibilidad y nuevas características. Dado que la explicación es extensa genere un archivo descargable con ejemplos y un pdf que nos muestra la configuración paso a paso.
La imagen siguiente muestra algunas de las barras de navegacion que se pueden obtener con esta clase y hojas de estilo.

Estilos de la barra de navegacion

Estilos para la barra de navegacion.

Espero que les sea de utilidad.
Paginador 3.0.0

Los estilos fueron obtenidos de los siguientes sitios.
Mis Algoritmos
TimerSys

Paginador en PHP versión 2.1.0

Bueno esta es una pequeña actualización de la clase paginador para ofrecer la funcionalidad de poder ocultar los mensajes de primero, anterior, siguiente, ultimo, bloque anterior, bloque siguiente etc que fue sugerido por el Usuario RAM, en el articulo de paginación. Como la sugerencia me pareció de utilidad y que aportaba facilidad para configurar la vista final que obtenemos versione la clase.
La forma de utilizar la clase es igual que la versión anterior (ver Paginador en PHP 2.0.0) lo único que incluimos un nuevo método llamado setOmitir($omitir = array) al cual se le pasara un arreglo con las etiquetas que no se quieren mostrar.

Ejemplo obtener que solo se muestren los enlaces siguiente y anterior.

    // Comenzamos con el paginador.
    require_once 'Paginador.php';
    // Instanciamos la clase Paginador
    $paginador          = new Paginador();
 
    // Configuramos cuanto registros por pagina que debe ser igual a el limit de la consulta mysql
    $paginador->setCantidadRegistros(1);
    $paginador->setCantidadEnlaces(1);
    $paginador->setOmitir(array('primero',
                                'numero',
                                'actual',
                                'bloqueAnterior',
                                'bloqueSiguiente',
                                'ultimo'));
    $paginador->setTitulosVista('anterior', '<< Anterior ');
    $paginador->setTitulosVista('siguiente', ' Siguiente >>');
 
    // Y mandamos a paginar desde la pagina actual y le pasamos tambien el total
    // de registros de la consulta mysql.
    $datos              = $paginador->paginar($pagina, $totalRegistros);
Es importante en este ejemplo configurar la cantidad de registros por pagina a 1, pues si solo queremos obtener algo del estilo <>, para que calcule bien el numero de paginas es importante que existe un solo registro por pagina. No es así con cantidad de enlaces porque por mas que fueran 5, 6 o 10 como no los mostrara para nosotros sera lo mismo en cuanto a la vista.
Algo a tener en cuenta que actual en caso de un enlace va a coincidir con numero, pero la diferencia es que si configuramos para no mostrar actual, entonces no se mostrara el enlace para la pagina en la cual estamos parados y el paginador podria mostrar algo como 1 2 4 5 6 … omitiría el 3 porque estamos en esa pagina.

Ahora el turno de la clase Paginador versionada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
<?php
/**
 * Clase Paginador.
 * Su responsabilidad es realizarnos el paginado de una consulta, es decir
 * proporcionar datos para realizar la barra de navegacion de la paginacion.
 * @package     varias creado en el projecto opet
 * @copyright   2010 - ObjetivoPHP
 * @license     Gratuito (Free) http://www.opensource.org/licenses/gpl-license.html
 * @author      Marcelo Castro (ObjetivoPHP)
 * @link        objetivophp@*******.****
 * @version     2.1.0 (16/06/2008 - 09/04/2011)
 * @since       Version 2.1.0 agregado funcionalidad para omitir enlaces,
 *              idea de RAM.
 */
class Paginador
{
    /**
     * Contiene los titulos que se mostraran en la barra de navegacion. O sea
     * primera, anteriror, .... , ultima, siguiente etc...
     * @var array 
     */
    private $_titulos = array('primero'           => array('vista'  => '| Primero ...',
                                                           'title'  => 'Ir a la primera Pagina'),
                              'bloqueAnterior'    => array('vista'  => '<<',
                                                           'title'  => 'Bloque Anterior'),
                              'anterior'          => array('vista'  => '<',
                                                           'title'  => 'Pagina Anterior'),
                              'siguiente'         => array('vista'  => '>',
                                                           'title'  => 'Pagina Siguiente'),
                              'bloqueSiguiente'   => array('vista'  => '>>',
                                                           'title'  => 'Bloque Siguiente'),
                              'ultimo'            => array('vista'  => '... Ultimo |',
                                                           'title'  => 'Ir a la Ultima Pagina'),
                              'numero'            => array('vista'  => null,
                                                           'title'  => 'Ir a la pagina '),
                              'actual'            => array('vista'  => null,
                                                           'title'  => 'Estas viendo esta pagina')
                             );
 
    /**
     * Contiene los marcadores que van antes y despues de la pagina actual,
     * para identificarla visualmente en la barra de navegacion del paginador.
     * @var array
     */
    private $_marcador = array('antes'      => '|',
                               'despues'    => '|');
 
    /**
     * Guarda el resultado de la paginacion por si es requrido mas tarde.
     * Formato array('vista' => 'primero', 'numero' => 0).
     * @var array
     */
    private $_paginacion = array();
 
    /**
     * Es la cantidad de registros, filas de la tabla que se mostraran por cada
     * pantalla.
     * @var integer
     */
    private $_cantidadDeRegistrosPorPagina = 10;
 
    /**
     * Es la cantidad de Enlaces o vinculos que contendra el paginador, sin contar
     * los especiales como ser primero, ultimo etc..
     * @var integer
     */
    private $_cantidadDeEnlacesDelPaginador = 10;
 
    /**
     * Contiene la cantidad total de paginas del paginador.
     * @var integer
     */
    private $_cantidadPaginas;
 
    private $_omitir    = array();
 
    /**
     * Metodo __construct.
     * Crea el objeto Paginador.
     * @param   integer $crpp   Cantidad de Registros a desplegarse en cada Pagina.
     * @param   integer $cepp   Cantidad de enlaces del paginador, sin especiales.
     * @return  void
     */
    public function  __construct($crpp = 10, $cep = 10)
    {
        $this->_cantidadDeRegistrosPorPagina    = ((int)$crpp > 0)? $crpp : 10;
        $this->_cantidadDeEnlacesDelPaginador   = ((int)$cep > 0)? $cep : 10;
    }
 
    /**
     * Metodo setCantidadRegistros.
     * Configura la cantidad de registros que se desplegan en la pantalla.
     * @param   integer $cantidad   Cantidad de Registros por pagina.
     * @return  void
     */
    public function setCantidadRegistros($cantidad = 10)
    {
        $this->_cantidadDeRegistrosPorPagina    = ((int)$cantidad > 0)? $cantidad : 10;
    }
 
    /**
     * Metodo setCantidadEnlaces.
     * Configura la cantidad de enlaces que contendra el paginador sin considerar los
     * enlaces especiales.
     * @param   integer $cantidad   Cantidad de Enlaces que se quieren mostrar.
     * @return  void
     */
    public function setCantidadEnlaces($cantidad = 10)
    {
        $this->_cantidadDeEnlacesDelPaginador   = ((int)$cantidad > 0)? $cantidad : 10;
    }
 
    /**
     * Metodo paginar.
     * Realiza el paginado, generando todos los bloques.
     * @param   integer $pagina Contiene desde que pagina se desplegara.
     * @param   integer $cantidadDeResultados  total de resutados de la consulta.
     * @return  array
     */
	public function paginar($pagina,$cantidadDeResultados)
	{
        $pagina = ((int)$pagina < 0)? 0 : $pagina;
        if ($cantidadDeResultados < 1) { // No hay resultados que paginar
            return false;
        }
        // Aqui significa que tenemos resultados y vamos a paginar
        // Preparo las variables que se utilizaran
		$paginaInicial  = $paginaFinal    = 0;
		$paginacion     = array();
		$totalPaginas	= ceil($cantidadDeResultados / $this->_cantidadDeRegistrosPorPagina);
 
		if ($totalPaginas < 2) { // Si es menor a 2 es una pagina por lo tanto no pagino.
            $this->_cantidadPaginas = 1;
            return false;
        }
 
	   	if ($totalPaginas <= $this->_cantidadDeEnlacesDelPaginador) {
            $paginaInicial		= 1;
			$paginaFinal		= $totalPaginas;
		} else {
            $centroPaginador 	= floor($this->_cantidadDeEnlacesDelPaginador / 2);
			$paginaInicial		= ($pagina+1) - $centroPaginador;
			$paginaFinal		= $paginaInicial + $this->_cantidadDeEnlacesDelPaginador - 1;
 
			if ($paginaFinal > $totalPaginas) {
                $paginaFinal    = $totalPaginas;
				$paginaInicial  = $paginaFinal - ($this->_cantidadDeEnlacesDelPaginador -1);
			}
 
			if ($paginaInicial < 1) {
                $paginaInicial	= 1;
				$paginaFinal	= $this->_cantidadDeEnlacesDelPaginador;
			}
		}
 
		$ajuste				= floor($this->_cantidadDeEnlacesDelPaginador / 2);
		$ajuste2			= 1 - ($this->_cantidadDeEnlacesDelPaginador % 2);
		$blockInicio		= $paginaInicial - $this->_cantidadDeEnlacesDelPaginador + $ajuste  - 1;
		$blockFinal			= $paginaFinal + $this->_cantidadDeEnlacesDelPaginador - $ajuste  + $ajuste2;
 
		$paginaInicial		= $paginaInicial - 1;
		$paginaFinal		= $paginaFinal - 1;
 
		if ($totalPaginas > 1 && !in_array('primero', $this->_omitir)) {
            if ($paginaInicial != 0) {
                $paginacion[] = array('numero'   => 0,
                                      'vista'    => $this->_titulos['primero']['vista'],
                                      'title'    => $this->_titulos['primero']['title']);
            }
		}
		/* Configurar Block de Inicio */
		if ($blockInicio > $ajuste && !in_array('bloqueAnterior', $this->_omitir)) {
            $paginacion[]    = array('numero'    => $blockInicio,
                                     'vista'     => $this->_titulos['bloqueAnterior']['vista'],
                                     'title'     => $this->_titulos['bloqueAnterior']['title']);
        }
		/* Configurar anterior */
		if($pagina > 0 && !in_array('anterior', $this->_omitir)) {
            $paginacion[]    = array('numero'    => $pagina-1,
                                     'vista'     => $this->_titulos['anterior']['vista'],
                                     'title'     => $this->_titulos['anterior']['title']);
        }
		/* Inicio Block Central */
        for ( $f = $paginaInicial; $f <= $paginaFinal; $f++) {
            if ($f != $pagina && !in_array('numero', $this->_omitir)) {
                $paginacion[]= array('numero'    => $f,
                                     'vista'     => $f+1,
                                     'title'     => $this->_titulos['numero']['title'] . ($f+1));
            } elseif (!in_array('actual', $this->_omitir)) {
                $paginacion[]= array('numero'    => $f,
                                     'vista'     => $this->_marcador['antes']
                                                 . ($f+1) . $this->_marcador['despues'],
                                     'title'     => $this->_titulos['actual']['title']);
                }
            }
 
		/* Fin block Central */
		/* Configurar siguiente */
		if ($pagina < ($totalPaginas-1) && !in_array('siguiente', $this->_omitir)) {
            $paginacion[]    = array('numero'    => $pagina+1,
                                     'vista'     => $this->_titulos['siguiente']['vista'],
                                     'title'     => $this->_titulos['siguiente']['title']);
        }
		/* Fin block siguiente */
		/* Configurar Block de Final */
        if ($paginaFinal < ($totalPaginas - $this->_cantidadDeEnlacesDelPaginador - 1) && !in_array('bloqueSiguiente', $this->_omitir)) {
            $paginacion[]    = array('numero'    => $blockFinal-1,
                                     'vista'     => $this->_titulos['bloqueSiguiente']['vista'],
                                     'title'     => $this->_titulos['bloqueSiguiente']['title']);
        }
		/* Fin block Final */
		if ( $paginaFinal != ($totalPaginas - 1) && !in_array('ultimo', $this->_omitir)) {
            $paginacion[]    = array('numero'    => $totalPaginas-1,
                                     'vista'     => $this->_titulos['ultimo']['vista'],
                                     'title'     => $this->_titulos['ultimo']['title']);
		}
		$this->_paginacion      = $paginacion;
        $this->_cantidadPaginas = $totalPaginas;
		return $paginacion;
	}
 
    /**
     * Metodo setTitulosVista.
     * Configura los simbolos que se usaran para el enunciado de bloques,
     * primero, ultimo, anterior, siguiente etc...
     * @param   string  $titulo Titulo que se desea cambiar. primero, ultimo etc.
     * @param   string  $valor  Valor que tendra la etiqueta.
     * @return  void
     */
    public function setTitulosVista($titulo, $valor)
    {
        if (array_key_exists($titulo, $this->_titulos)) {
           $this->_titulos[$titulo]['vista'] = $valor;
        }
    }
 
    /**
     * Metodo setTitulosTitle.
     * @param   string  $titulo Etiqueta a la que se desea cambiar la propiedad title.
     * @param   string  $valor  Valor que tendra la etiqueta.
     * @return  void
     */
    public function setTitulosTitle($titulo, $valor)
    {
        if (array_key_exists($titulo, $this->_titulos)) {
           $this->_titulos[$titulo]['title'] = $valor;
        }
    }
 
    public function setOmitir($omitir = array())
    {
        if (is_array($omitir)) {
            $this->_omitir = $omitir;
        }
    }
 
    /**
     * Metodo setMarcador.
     * @param   string  $antes      Simbolo que va antes del enlace de pagina actual.
     * @param   string  $despues    Simbolo que va despues del enlace de la pagina actual.
     * @return  void
     */
    public function setMarcador($antes, $despues)
    {
        $this->_marcador['antes']   = $antes;
        $this->_marcador['despues'] = $despues;
    }
 
    /**
     * Metodo getPaginacion.
     * Nos retorna el arreglo de paginacion.
     * @return array
     */
    public function getPaginacion()
    {
        return $this->_paginacion;
    }
 
    /**
     * Metodo getCantidadPaginas.
     * Nos retorna la cantidad de paginas que tiene el paginador.
     * @return integer
     */
    public function getCantidadPaginas()
    {
        return $this->_cantidadPaginas;
    }
}
Bueno espero que esta pequeña modificación incremente la utilidad de la misma, saludos y gracias por los comentarios…
Esta clase genera un arreglo (tabla) conteniendo los cruces para una liga, donde todos los equipos se deben cruzar entre si. Ejemplo si tenemos 10 equipos se generara una matriz de 9 filas (Cantidad de Fechas necesarias) por 5 columnas (partidos por fechas), cada elemento contendrá una sub-matriz con los dos equipos que se enfrentaran, el siguiente cuadro muestra una representación de la matriz que se obtendrá.
Cerro
Peñarol
River Plate
Racing
Liverpool
Defensor SP.
Danubio
Wanderers
Nacional
Rampla Jrs
Rampla Jrs
Peñarol
Wanderers
Nacional
Defensor SP.
Danubio
Racing
Liverpool
Cerro
River Plate
River Plate
Peñarol
Liverpool
Cerro
Danubio
Racing
Nacional
Defensor SP.
Rampla Jrs
Wanderers
Wanderers
Peñarol
Defensor SP.
Rampla Jrs
Racing
Nacional
Cerro
Danubio
River Plate
Liverpool
Liverpool
Peñarol
Danubio
River Plate
Nacional
Cerro
Rampla Jrs
Racing
Wanderers
Defensor SP.
Defensor SP.
Peñarol
Racing
Wanderers
Cerro
Rampla Jrs
River Plate
Nacional
Liverpool
Danubio
Danubio
Peñarol
Nacional
Liverpool
Rampla Jrs
River Plate
Wanderers
Cerro
Defensor SP.
Racing
Racing
Peñarol
Cerro
Defensor SP.
River Plate
Wanderers
Liverpool
Rampla Jrs
Danubio
Nacional
Nacional
Peñarol
Rampla Jrs
Danubio
Wanderers
Liverpool
Defensor SP.
River Plate
Racing
Cerro

Código de la Clase:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<?php
/**
 * Clase Fixture.
 * Genera una tabla de cruces para un torneo tipo Single Round Robin. o de
 * liguilla.
 *
 * @author      Marcelo Castro
 * @package     Fixture creado en el projecto opet
 * @copyright   2011 - ObjetivoPHP
 * @license     Gratuito (Free) http://www.opensource.org/licenses/gpl-license.html
 * @author      Marcelo Castro (ObjetivoPHP)
 * @link        objetivophp@******.*****
 * @link        http://objetivophp.com
 * @version     0.0.1 (19/02/2011 - 21/02/2011)
 */
class Fixture
{
    /**
     * Cantidad de equipos participantes en el torneo.
     * @var integer
     */
    private $_cantidadEquipos   = 10;
 
    /**
     * Cantidad de equipos utilizados para armar el fixture.
     * Puede haber uno mas en caso de ser impar el numero de equipos.
     * @var integer
     */
    private $_equiposFixture;
 
    /**
     * Cantidad de fechas que contendra el torneo.
     * @var integer
     */
    private $_fechas;
 
    /**
     * Cantidad de partidos que se jugaran por fecha.
     * @var integer
     */
    private $_partidosXFechas;
 
    /**
     * Guarda la matriz del fixture, incluye el equipo ficticio en caso de que
     * sea necesario.
     * @var array
     */
    private $_fixture           = array();
 
    /**
     * Contiene los nombres de los equipos o en su defecto los numeros, que se
     * le otorgaron a cada uno.
     * @var array
     */
    private $_equipos           = array();
 
    /**
     * Contiene si se seudo-aleatoriza la tabla de cruces o no.
     * @var boolean
     */
    private $_aleatorio         = true;
 
    /**
     * Contiene que debe de ponerse cuando un cuadro queda libre, caso
     * de cantidad de cuadros impares.
     * @var string
     */
    private $_libre             = 'libre';
 
    /**
     * Metodo __construct.
     * @param   mixed     $equipos    Cantidad de equipos o arreglo con los nombres.
     * @return  void
     */
    public function __construct($equipos = null)
    {
        if (is_array($equipos)) {
            $this->_cantidadEquipos = count($equipos);
            $this->_equipos         = $equipos;
        } else {
            $this->_cantidadEquipos =  is_int($equipos)? $equipos : 10;
            for ($f = 0; $f <= $this->_cantidadEquipos; $f++) {
                $this->_equipos[$f] = $f+1;
            }
        }
 
        $this->_partidosXFechas = ceil($this->_cantidadEquipos /2 );
        $this->_equiposFixture  = $this->_cantidadEquipos +  $this->_cantidadEquipos % 2;
        $this->_fechas          = $this->_partidosXFechas * 2 - 1 ;
    }
 
    /**
     * Configura si se aleatoriza la tabla de cruces.
     * @param   boolean     $aleatorio
     * @return  void
     */
    public function setAleatorio($aleatorio = true)
    {
        $this->_aleatorio   = ($aleatorio)? true : false;
    }
 
    /**
     * Asigna el comentario para fecha libre.
     * @param   string  $cometario
     * @return  void
     */
    public function setFechaLibre($comentario)
    {
        $this->_libre = $comentario;
    }
 
    /**
     * Metodo tablaDeCruces.
     * Genera una matriz con los cruces correspondientes entre los equipos.
     * @return void
     */
    public function tablaDeCruces()
    {
        $fixture   = array();
        if ($this->_aleatorio) {
            shuffle($this->_equipos);
        }
 
        if ($this->_cantidadEquipos % 2) {
            $this->_equipos[$this->_equiposFixture-1] = $this->_libre;
        }
 
        // Lleno el indice A de cada elemento con numeros del numero 1
        // hasta llegar al maximo de fechas y vuelvo a comenzar en 1.
        // El ultimo numero puesto debe ser el maximo de fechas.-
        $datos      = $this->_partidosXFechas * $this->_fechas;
        for ($f = 1; $f <= $datos; $f++) {
 
            $col        = $f % $this->_partidosXFechas;
            $col        = ($col != 0)? $col : $this->_partidosXFechas;
            $fila       = ceil ($f / $this->_partidosXFechas);
            $auxiliar   = $f % $this->_fechas;
            if ($auxiliar == 0) {
                $auxiliar = (int) $this->_fechas;
            }
            $fixture[$fila][$col]['A'] = $this->_equipos[$auxiliar-1];
        }
 
        // Lleno el primer elemento de cada fila con el ultimo equipo
        // o el equipo ficticio, si la cantidad de equipo es impar.
        for ($f = 1; $f<= $this->_fechas; $f++) {
            $fixture[$f][1]['B']    = $this->_equipos[$this->_equiposFixture-1];
        }
 
        // Lleno el indice B de cada elemento empezando del maximo de fechas
        // hasta 1 y vuelvo a empezar salteo la primer columna que ya fue completada
        // en el ciclo anterior
        $indice = $this->_fechas;
        for ($f = 1; $f <= $this->_fechas; $f++) {
            for ($c = 2; $c <= $this->_partidosXFechas; $c++) {
                $fixture[$f][$c]['B']   = $this->_equipos[$indice - 1];
                if (--$indice == 0) {
                    $indice = $this->_fechas;
                }
            }
        }
        $this->_fixture     = $fixture;
    }
 
    /**
     * Retorna el arreglo de todos los cruces.
     * @return array 
     */
    public function getCruces()
    {
        return $this->_fixture;
    }
 
    /**
     * Metodo verCuadro.
     * Muestra la tabla de cruces en una tabla HTML, es solo a efectos demostrativos
     * @return  HTML
     */
    public function verCuadro()
    {
        echo "<table border=1>\n";
        for ($f = 1; $f <= $this->_fechas; $f++) {
            echo "<tr>\n";
            for ($c = 1; $c <= $this->_partidosXFechas; $c++) {
                echo "<td>";
                echo utf8_decode($this->_fixture[$f][$c]['A']);
                echo '</br>' . utf8_decode($this->_fixture[$f][$c]['B']);
                echo "</td>\n";
            }
            echo "</tr>\n";
        }
        echo "</table>";
    }
}

Método de Uso:
Como siempre por tratarse de una clase lo primero que debemos hacer es instanciarla,

$objFix     = new Fixture($equipos);
La variable $equipos, puede tomar dos tipos de datos, o puede ser un entero o puede ser un arreglo, si es un entero este sera tomado como la cantidad de equipos que participaran en el torneo. Si es un arreglo cada elemento del mismo debe ser el nombre de un equipo participante en el torneo y se tomara el tamaño del arreglo como la cantidad de equipos participantes.
// Primera forma pasamos un entero.
$equipos    = 10;
// Segunda forma pasamos un arreglo con los datos
$equipos    = array('Peñarol',
                    'Nacional',
                    'Liverpool',
                    'River Plate',
                    'Defensor SP.',
                    'Rampla Jrs',
                    'Wanderers',
                    'Cerro',
                    'Racing',
                    'Danubio');
// La definicion de la variable $equipos debe ser realizada antes de la instancia.

Configuraciones:

Solo tenemos dos métodos de configuración, setAleatorio y setFechaLibre.
setAleatorio solo recibe un parámetro de tipo boolean, donde si este es true generara la tabla en una forma seudo-aleatoria en realidad lo que realiza es un mezclado de los equipos pero no de la solución de cruces que siempre sera la misma. Por defecto se asume true
$objFix->setAleatorio(true);
// No es necesario para true pero es a modo de ejemplo.

setFechaLibre recibe un string (cadena de caracteres), que representa el comentario que se pondrá cuando un equipo tenga fecha libre.

$objFix->setFechaLibre('Libre');

Eso es lo único que podemos configurar.
Luego de realizar o no dicha configuración ejecutamos el método que genera la matriz de cruces.

$objFix->tablaDeCruces();

Por ultimo tenemos el método de captura de los resultados, para ello contamos con getCruces(), que nos retornara el arreglo o matriz con los emparejamientos de cuadros.

$cruces     = $objFix->getCruces();

Por ultimo mencionare el método tablaDeCruces() que en realidad esta puesto solo para ver en formato HTML la tabla de cruces, pero no debería formar parte de la clase.

Espero a alguien le sea de utilidad.

Generador de Números Aleatorios

Esta clase la realice no se con que fin y no se que utilidad pueda tener todavia, mas allá de jugar un rato con ella y programar otro poco. Se encarga de generar números aleatorios en un entorno dado, pudiendo elegir incluso la cantidad de decimales, la clase nos retorna como salida un arreglo con la cantidad de elementos seleccionados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?php
/**
 * Clase Aleatorio.
 * Genera un numero aleatorio entre dos numeros dados.
 *
 * @package     matematica creado en el projecto ipusa
 * @copyright   2010 - ObjetivoPHP
 * @license     Gratuito (Free) http://www.opensource.org/licenses/gpl-license.html
 * @author      Marcelo Castro (ObjetivoPHP)
 * @link        objetivophp@*****.***
 * @version     1.0.0 (17/09/2010 - 17/09/2010)
 */
class Aleatorio
{
    /**
     * Es el extremo inferior del entorno de los numero aleatorios.
     * @var float
     */
    private $_extremoInferior = 0;
 
    /**
     * Es el extremo superior del entorno superior de los numeros aleatorios.
     * @var float
     */
    private $_extremoSuperior = 1;
 
    /**
     * Cantidad de decimales, 0 para entero, max 10.
     * @var integer
     */
    private $_decimales = 0;
 
    /**
     * Cantidad de numeros aleatorios a Generar.
     * @var integer
     */
    private $_cantidad = 1;
 
    /**
     * Configura si seran aleatorios unicos false, o true para que se puedan repetir.
     * @var boolean
     */
    private $_permitirRepetidos = true;
 
    /**
     * Guarda los numeros aleatorios generados.
     * @var array
     */
    private $_aleatorios = array();
 
    /**
     * Metodo __construct.
     * @param   double  $extInferior    Numero minimo que se puede generar.
     * @param   double  $extSuperior    Numero maximo que se puede generar.
     * @return  void
     */
    public function  __construct($extInferior, $extSuperior)
    {
        if ($extSuperior > $extInferior) {
            $this->_extremoInferior = $extInferior;
            $this->_extremoSuperior = $extSuperior;
        }
    }
 
    /**
     * Metodo setDecimales.
     * Configura cuantos decimales despues de la coma deber tener el numero
     * aleatorio generado.
     * @param   integer $decimales  cantidad de decimales despues de la coma.
     * @return  void
     */
    public function setDecimales($decimales)
    {
        if ($decimales >=0 && $decimales <=10) {
            $this->_decimales = (int) $decimales;
        }
    }
 
    /**
     * Metodo setCantidad.
     * Configura la cantidad de numeros aleatorios que deberan generarse.
     * @param   integer $cantidad   Cantidad de numeros a generarse.
     * @return  void
     */
    public function setCantidad($cantidad)
    {
        $this->_cantidad = ($cantidad > 0)? (int) $cantidad : 1;
    }
 
    /**
     * Metodo setPermitirRepetidos.
     * Configuramos si se pueden repetir numeros o no.
     * @param   boolean $repetir true se pueden repetir los numeros
     *                           false no se puede repetir
     * @return  void
     */
    public function setPermitirRepetidos($repetir = true)
    {
        $this->_permitirRepetidos = ($repetir)? true : false;
    }
 
    /**
     * Metodo generar.
     * Genera los numeros aleatorios.
     * @return array
     */
    public function generar()
    {
        if (!$this->_controlarBucle()) {
            trigger_error('No se permite generar mas del 75% de los numeros unicos.', E_USER_ERROR);
            return;
        }
        mt_srand();
        $maxAleatorio   = mt_getrandmax();
        $amplitud       = $this->_extremoSuperior - $this->_extremoInferior;
 
        for ($i = 0; $i < $this->_cantidad; $i++) {
            do {
                $aleatorio  = mt_rand() / $maxAleatorio;
                $numero     = ($amplitud * $aleatorio) + $this->_extremoInferior;
                $numero     = number_format($numero, $this->_decimales);
            } while (!$this->_permitirRepetidos && in_array($numero, $this->_aleatorios));
            $this->_aleatorios[$i] = $numero;
        }
        return $this->_aleatorios;
    }
 
    /**
     * Metodo getAleatorios.
     * Retorna los numeros aleatorios que fueron generados.
     * @param   integer $orden 1 = Ascendente, 2 = descendente, otro sin ordenar.
     * @return  array
     */
    public function getAleatorios($orden = null)
    {
        $numeros    = $this->_aleatorios;
        switch ($orden) {
            case 1:
                sort($numeros);
                break;
            case 2:
                rsort($numeros);
                break;
            default:
        }
        return $numeros;
    }
 
    /**
     * Metodo _controlarBucle.
     * Ofrece seguridad de no caer en un bucle infinito.
     * @return boolean
     */
    private function _controlarBucle()
    {
        $posible    = true;
        if ($this->_permitirRepetidos === false) {
            $intervalo      = 1 / pow(10, $this->_decimales);
            $amplitud       = $this->_extremoSuperior - $this->_extremoInferior + $intervalo;
            $maxCantidad    = $amplitud / $intervalo;
            if (($maxCantidad * 0.75) <= $this->_cantidad) {
                $posible    = false;
            }
        }
        return $posible;
    }
}
Bueno la utilización es sencilla. Como siempre primero instanciamos la clase, dándole los parámetros inferiores y superiores. Luego si queremos alguna opción más se la damos y por ultimo enviamos a generar.

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Instanciamos la clase y le decimos que genere en el entorno 15,99
$obj = new Aleatorio(15, 99);
//Podemos Congiguramos la cantidad de numeros que queremos si no ponemos nada es 1.
$obj->setCantidad(5);
// Cantidad de números después de la coma, 0 (cero) para enteros.
$obj->setDecimales(0);
// Configuramos si queremos que se repitan o no los numeros aleatorios.
$obj->setPermitirRepetidos(false);
// Generamos los numeros una vez seleccionadas las opciones que queremos.
// generar retorna un arreglo pero si no lo capturamos lo podremos hacer luego 
// con getAleatorios
$obj->generar();
// Capturamos los numeros generados.
// 1> ascendente - 2> Descendente - nullo como salieron
$numeros    = $obj->getAleatorios(1);
// Imprimimos los resultados
var_dump($numeros);

Bueno espero que a alguna persona le sea de utilidad.

Rezampleo de imágenes por lotes

Macarena Amezqueta, nos envió una ampliación de la rutina para procesar imágenes en el servidor por lotes.
Transcribo el correo-e enviado:

Mi problema es que tengo 60 GB de imágenes en un servidor que tengo que migrar y es un poco complicado. Encontré tu librería para modificar imágenes y me parecio excelente.
Lo que hice fue modificar el script para que lea directamente desde un directorio y le cambie solamente la calidad a las fotos, para luego guardarlas en una nueva carpeta dejando la foto original donde esta

Solamente hay que correr el archivo procesarImagen.php
Inicialmente hice unas pruebas localmente a traves del explorador, y luego subi toda la carpeta a un servidor linux.

Para correr el script solamente puse lo siguiente
/usr/local/php5/php /home/macarena/procesarImagen.php

el usr/local/php5 o lo que sea es el directorio donde estan los binarios de php.

Para ubuntu solamente tenes que poner
php /home/macarena/procesarImagen.php

El scritp me dio muy buenos resultados, con un lote de prueba de 1000 imagenes de 90MB bajo su peso a 21MB solamente modificando la calidad

Besos y gracias!!!!

Macarena Amézqueta
Desarrollos Web integrales
www.amezqueta.com.ar
Imágenes por lotes