File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / tests / lang / foreachLoopIteratorAggregate.001.phpt
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 5 months ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_29, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, v5_3_10, HEAD
php

    1: --TEST--
    2: foreach with iteratorAggregate
    3: --FILE--
    4: <?php
    5: class EnglishMealIterator implements Iterator {
    6: 	private $pos=0;
    7: 	private $myContent=array("breakfast", "dinner", "tea");
    8: 	
    9: 	public function valid() {
   10: 		global $indent;
   11: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   12: 		return $this->pos < count($this->myContent);
   13: 	}
   14: 	
   15: 	public function next() {
   16: 		global $indent;
   17: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   18: 		$this->pos++;
   19: 	}
   20: 	
   21: 	public function rewind() {
   22: 		global $indent;
   23: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   24: 		$this->pos=0;
   25: 	}
   26: 
   27: 	public function current() {
   28: 		global $indent;
   29: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   30: 		return $this->myContent[$this->pos];
   31: 	}
   32: 	
   33: 	public function key() {
   34: 		global $indent;
   35: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   36: 		return "meal " . $this->pos;
   37: 	}
   38: 	
   39: }
   40: 
   41: class FrenchMealIterator implements Iterator {
   42: 	private $pos=0;
   43: 	private $myContent=array("petit dejeuner", "dejeuner", "gouter", "dinner");
   44: 	
   45: 	public function valid() {
   46: 		global $indent;
   47: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   48: 		return $this->pos < count($this->myContent);
   49: 	}
   50: 	
   51: 	public function next() {
   52: 		global $indent;
   53: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   54: 		$this->pos++;
   55: 	}
   56: 	
   57: 	public function rewind() {
   58: 		global $indent;
   59: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   60: 		$this->pos=0;
   61: 	}
   62: 
   63: 	public function current() {
   64: 		global $indent;
   65: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   66: 		return $this->myContent[$this->pos];
   67: 	}
   68: 	
   69: 	public function key() {
   70: 		global $indent;
   71: 		echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
   72: 		return "meal " . $this->pos;
   73: 	}
   74: 	
   75: }
   76: 
   77: 
   78: Class EuropeanMeals implements IteratorAggregate {
   79: 	
   80: 	private $storedEnglishMealIterator;
   81: 	private $storedFrenchMealIterator;
   82: 	
   83: 	public function __construct() {
   84: 		$this->storedEnglishMealIterator = new EnglishMealIterator;
   85: 		$this->storedFrenchMealIterator = new FrenchMealIterator;
   86: 	}
   87: 	
   88: 	public function getIterator() {
   89: 		global $indent;
   90: 		echo "$indent--> " . __METHOD__  . "\n";
   91: 		
   92: 		//Alternate between English and French meals
   93: 		static $i = 0;
   94: 		if ($i++%2 == 0) {
   95: 			return $this->storedEnglishMealIterator;
   96: 		} else {
   97: 			return $this->storedFrenchMealIterator;
   98: 		}
   99: 	}
  100: 	
  101: }
  102: 
  103: $f = new EuropeanMeals;
  104: var_dump($f);
  105: 
  106: echo "-----( Simple iteration 1: )-----\n";
  107: foreach ($f as $k=>$v) {
  108: 	echo "$k => $v\n";	
  109: }
  110: echo "-----( Simple iteration 2: )-----\n";
  111: foreach ($f as $k=>$v) {
  112: 	echo "$k => $v\n";	
  113: }
  114: 
  115: 
  116: $indent = " ";
  117: echo "\n\n\n-----( Nested iteration: )-----\n";
  118: $count=1;
  119: foreach ($f as $k=>$v) {
  120: 	echo "\nTop level "  .  $count++ . ": \n"; 
  121: 	echo "$k => $v\n";
  122: 	$indent = "     ";
  123: 	foreach ($f as $k=>$v) {
  124: 		echo "     $k => $v\n";	
  125: 	}
  126: 	$indent = " ";
  127: }
  128: 
  129: 
  130: ?>
  131: ===DONE===
  132: --EXPECTF--
  133: object(EuropeanMeals)#%d (2) {
  134:   ["storedEnglishMealIterator":"EuropeanMeals":private]=>
  135:   object(EnglishMealIterator)#%d (2) {
  136:     ["pos":"EnglishMealIterator":private]=>
  137:     int(0)
  138:     ["myContent":"EnglishMealIterator":private]=>
  139:     array(3) {
  140:       [0]=>
  141:       string(9) "breakfast"
  142:       [1]=>
  143:       string(6) "dinner"
  144:       [2]=>
  145:       string(3) "tea"
  146:     }
  147:   }
  148:   ["storedFrenchMealIterator":"EuropeanMeals":private]=>
  149:   object(FrenchMealIterator)#%d (2) {
  150:     ["pos":"FrenchMealIterator":private]=>
  151:     int(0)
  152:     ["myContent":"FrenchMealIterator":private]=>
  153:     array(4) {
  154:       [0]=>
  155:       string(14) "petit dejeuner"
  156:       [1]=>
  157:       string(8) "dejeuner"
  158:       [2]=>
  159:       string(6) "gouter"
  160:       [3]=>
  161:       string(6) "dinner"
  162:     }
  163:   }
  164: }
  165: -----( Simple iteration 1: )-----
  166: --> EuropeanMeals::getIterator
  167: --> EnglishMealIterator::rewind (0)
  168: --> EnglishMealIterator::valid (0)
  169: --> EnglishMealIterator::current (0)
  170: --> EnglishMealIterator::key (0)
  171: meal 0 => breakfast
  172: --> EnglishMealIterator::next (0)
  173: --> EnglishMealIterator::valid (1)
  174: --> EnglishMealIterator::current (1)
  175: --> EnglishMealIterator::key (1)
  176: meal 1 => dinner
  177: --> EnglishMealIterator::next (1)
  178: --> EnglishMealIterator::valid (2)
  179: --> EnglishMealIterator::current (2)
  180: --> EnglishMealIterator::key (2)
  181: meal 2 => tea
  182: --> EnglishMealIterator::next (2)
  183: --> EnglishMealIterator::valid (3)
  184: -----( Simple iteration 2: )-----
  185: --> EuropeanMeals::getIterator
  186: --> FrenchMealIterator::rewind (0)
  187: --> FrenchMealIterator::valid (0)
  188: --> FrenchMealIterator::current (0)
  189: --> FrenchMealIterator::key (0)
  190: meal 0 => petit dejeuner
  191: --> FrenchMealIterator::next (0)
  192: --> FrenchMealIterator::valid (1)
  193: --> FrenchMealIterator::current (1)
  194: --> FrenchMealIterator::key (1)
  195: meal 1 => dejeuner
  196: --> FrenchMealIterator::next (1)
  197: --> FrenchMealIterator::valid (2)
  198: --> FrenchMealIterator::current (2)
  199: --> FrenchMealIterator::key (2)
  200: meal 2 => gouter
  201: --> FrenchMealIterator::next (2)
  202: --> FrenchMealIterator::valid (3)
  203: --> FrenchMealIterator::current (3)
  204: --> FrenchMealIterator::key (3)
  205: meal 3 => dinner
  206: --> FrenchMealIterator::next (3)
  207: --> FrenchMealIterator::valid (4)
  208: 
  209: 
  210: 
  211: -----( Nested iteration: )-----
  212:  --> EuropeanMeals::getIterator
  213:  --> EnglishMealIterator::rewind (3)
  214:  --> EnglishMealIterator::valid (0)
  215:  --> EnglishMealIterator::current (0)
  216:  --> EnglishMealIterator::key (0)
  217: 
  218: Top level 1: 
  219: meal 0 => breakfast
  220:      --> EuropeanMeals::getIterator
  221:      --> FrenchMealIterator::rewind (4)
  222:      --> FrenchMealIterator::valid (0)
  223:      --> FrenchMealIterator::current (0)
  224:      --> FrenchMealIterator::key (0)
  225:      meal 0 => petit dejeuner
  226:      --> FrenchMealIterator::next (0)
  227:      --> FrenchMealIterator::valid (1)
  228:      --> FrenchMealIterator::current (1)
  229:      --> FrenchMealIterator::key (1)
  230:      meal 1 => dejeuner
  231:      --> FrenchMealIterator::next (1)
  232:      --> FrenchMealIterator::valid (2)
  233:      --> FrenchMealIterator::current (2)
  234:      --> FrenchMealIterator::key (2)
  235:      meal 2 => gouter
  236:      --> FrenchMealIterator::next (2)
  237:      --> FrenchMealIterator::valid (3)
  238:      --> FrenchMealIterator::current (3)
  239:      --> FrenchMealIterator::key (3)
  240:      meal 3 => dinner
  241:      --> FrenchMealIterator::next (3)
  242:      --> FrenchMealIterator::valid (4)
  243:  --> EnglishMealIterator::next (0)
  244:  --> EnglishMealIterator::valid (1)
  245:  --> EnglishMealIterator::current (1)
  246:  --> EnglishMealIterator::key (1)
  247: 
  248: Top level 2: 
  249: meal 1 => dinner
  250:      --> EuropeanMeals::getIterator
  251:      --> EnglishMealIterator::rewind (1)
  252:      --> EnglishMealIterator::valid (0)
  253:      --> EnglishMealIterator::current (0)
  254:      --> EnglishMealIterator::key (0)
  255:      meal 0 => breakfast
  256:      --> EnglishMealIterator::next (0)
  257:      --> EnglishMealIterator::valid (1)
  258:      --> EnglishMealIterator::current (1)
  259:      --> EnglishMealIterator::key (1)
  260:      meal 1 => dinner
  261:      --> EnglishMealIterator::next (1)
  262:      --> EnglishMealIterator::valid (2)
  263:      --> EnglishMealIterator::current (2)
  264:      --> EnglishMealIterator::key (2)
  265:      meal 2 => tea
  266:      --> EnglishMealIterator::next (2)
  267:      --> EnglishMealIterator::valid (3)
  268:  --> EnglishMealIterator::next (3)
  269:  --> EnglishMealIterator::valid (4)
  270: ===DONE===

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>