Oscar's Blog

Blog de Oscar Valenzuela - GNU con Linux, Free Software, Android, Hacking

Clase Iterator (tipo Java) en PHP y update de ArrayList

18 Mar 2013


Viendo que la implementación de este patrón en PHP era pobre, decidí hacer mi propia clase tomando las características del Iterator de Java, así como ya lo hice con StringBuilder.

<?php

/**
* Copyright (C) 2013 - Pablo Sepúlveda @psep
*
* IteratorPattern v1.0a
*
* This file is part of gEvents.
* gEvents is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* gEvents is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gEvents. If not, see .
*
*/
class IteratorPattern{

private $position;
private $sizeList;
private $array;

function __construct($list){
$this->position = 0;
$this->array = $list;
$this->sizeList = $this->size();
}

/*
* @return tamaño de la lista
*/
private function size(){
$size = 0;

foreach ($this->array as $item) {
$size++;
}

return $size;
}

/*
* @return boolean
*
* Retorna true cuando el puntero (position)
* está dentro de la lista.
*/
public function hasNext(){
$result = false;

if($this->position == 0 && $this->sizeList > 0){
$result = true;
}else if($this->position sizeList){
$result = true;
}

return $result;
}

/*
* @return item de la lista según posición
*/
public function next(){
$item = NULL;

if($this->position sizeList){
$item = $this->array[$this->position];
$this->position++;
}

return $item;
}

}

?>

La clase lleva por nombre IteratorPattern para diferenciarse de la Interface Iterator de PHP (nombre protegido).

Así también hice unas mejoras para la clase ArrayList que hice un tiempo atrás:

<?php

/*
* Copyright (C) 2013 - Pablo Sepúlveda @psep
*
* ArrayList v1.5a
*
* This file is part of gEvents.
* gEvents is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* gEvents is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gEvents. If not, see .
*
*/
class ArrayList {

private $array = array();

/*
* @return valor del ArrayList
*/
public function getArrayList(){
return $this->array;
}

/*
* Limpia el array()
*/
public function clear(){
$this->array = array();
}

/*
* @param $item
*
* Agrega un nuevo item al array
*/
public function add($item){
$this->array[] = $item ;
}

/*
* @return array como una cadena de string
*/
public function toString(){
$cadena = "";
foreach ($this->array as $item) {
$cadena .= $item;
}
return $cadena;
}

/*
* @param $item
*
* Remueve un item determinado del array
*/
public function remove($item){
unset($this->array[$item]);
}

/*
* @param $item
*
* Retorna un item determinado
*/
public function get($item){
return $this->array[$item];
}

/*
* @return tamaño del array
*/
public function size(){
$size = 0;
foreach ($this->array as $item) {
$size++;
}
return $size;
}

}
?>

Todas las clases que he hecho y que haré como implementaciones las iré subiendo al proyecto “My PHP Classes” en Code Google para que queden a libre disposición. Pronto redactaré la wiki en el proyecto para que usuarios nóveles puedan usar las clases de manera fácil.