iterator_004.phpt 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. --TEST--
  2. SPL: SeekableIterator and string keys
  3. --FILE--
  4. <?php
  5. class NumericArrayIterator implements Iterator
  6. {
  7. protected $a;
  8. protected $i;
  9. public function __construct($a)
  10. {
  11. echo __METHOD__ . "\n";
  12. $this->a = $a;
  13. }
  14. public function rewind(): void
  15. {
  16. echo __METHOD__ . "\n";
  17. $this->i = 0;
  18. }
  19. public function valid(): bool
  20. {
  21. $ret = $this->i < count($this->a);
  22. echo __METHOD__ . '(' . ($ret ? 'true' : 'false') . ")\n";
  23. return $ret;
  24. }
  25. public function key(): mixed
  26. {
  27. echo __METHOD__ . "\n";
  28. return $this->i;
  29. }
  30. public function current(): mixed
  31. {
  32. echo __METHOD__ . "\n";
  33. return $this->a[$this->i];
  34. }
  35. public function next(): void
  36. {
  37. echo __METHOD__ . "\n";
  38. $this->i++;
  39. }
  40. }
  41. class SeekableNumericArrayIterator extends NumericArrayIterator implements SeekableIterator
  42. {
  43. public function seek($index): void
  44. {
  45. if ($index < count($this->a)) {
  46. $this->i = $index;
  47. }
  48. echo __METHOD__ . '(' . $index . ")\n";
  49. }
  50. }
  51. $a = array(1, 2, 3, 4, 5);
  52. foreach (new LimitIterator(new NumericArrayIterator($a), 1, 3) as $v)
  53. {
  54. print "$v\n";
  55. }
  56. echo "===SEEKABLE===\n";
  57. $a = array(1, 2, 3, 4, 5);
  58. foreach(new LimitIterator(new SeekableNumericArrayIterator($a), 1, 3) as $v)
  59. {
  60. print "$v\n";
  61. }
  62. echo "===SEEKING===\n";
  63. $a = array(1, 2, 3, 4, 5);
  64. $l = new LimitIterator(new SeekableNumericArrayIterator($a));
  65. for($i = 1; $i < 4; $i++)
  66. {
  67. $l->seek($i);
  68. print $l->current() . "\n";
  69. }
  70. ?>
  71. --EXPECT--
  72. NumericArrayIterator::__construct
  73. NumericArrayIterator::rewind
  74. NumericArrayIterator::valid(true)
  75. NumericArrayIterator::next
  76. NumericArrayIterator::valid(true)
  77. NumericArrayIterator::valid(true)
  78. NumericArrayIterator::current
  79. NumericArrayIterator::key
  80. 2
  81. NumericArrayIterator::next
  82. NumericArrayIterator::valid(true)
  83. NumericArrayIterator::current
  84. NumericArrayIterator::key
  85. 3
  86. NumericArrayIterator::next
  87. NumericArrayIterator::valid(true)
  88. NumericArrayIterator::current
  89. NumericArrayIterator::key
  90. 4
  91. NumericArrayIterator::next
  92. ===SEEKABLE===
  93. NumericArrayIterator::__construct
  94. NumericArrayIterator::rewind
  95. SeekableNumericArrayIterator::seek(1)
  96. NumericArrayIterator::valid(true)
  97. NumericArrayIterator::current
  98. NumericArrayIterator::key
  99. 2
  100. NumericArrayIterator::next
  101. NumericArrayIterator::valid(true)
  102. NumericArrayIterator::current
  103. NumericArrayIterator::key
  104. 3
  105. NumericArrayIterator::next
  106. NumericArrayIterator::valid(true)
  107. NumericArrayIterator::current
  108. NumericArrayIterator::key
  109. 4
  110. NumericArrayIterator::next
  111. ===SEEKING===
  112. NumericArrayIterator::__construct
  113. SeekableNumericArrayIterator::seek(1)
  114. NumericArrayIterator::valid(true)
  115. NumericArrayIterator::current
  116. NumericArrayIterator::key
  117. 2
  118. SeekableNumericArrayIterator::seek(2)
  119. NumericArrayIterator::valid(true)
  120. NumericArrayIterator::current
  121. NumericArrayIterator::key
  122. 3
  123. SeekableNumericArrayIterator::seek(3)
  124. NumericArrayIterator::valid(true)
  125. NumericArrayIterator::current
  126. NumericArrayIterator::key
  127. 4