xref: /PHP-8.4/ext/spl/tests/iterator_021.phpt (revision b3e08881)
1--TEST--
2SPL: RecursiveIteratorIterator and hasChildren
3--FILE--
4<?php
5
6class MyRecursiveArrayIterator extends RecursiveArrayIterator
7{
8    function valid(): bool
9    {
10        if (!parent::valid())
11        {
12            echo __METHOD__ . " = false\n";
13            return false;
14        }
15        else
16        {
17            return true;
18        }
19    }
20
21    function getChildren(): ?RecursiveArrayIterator
22    {
23        echo __METHOD__ . "\n";
24        return parent::getChildren();
25    }
26}
27
28class RecursiveArrayIteratorIterator extends RecursiveIteratorIterator
29{
30    private $max_depth;
31    private $over = 0;
32    private $skip = false;
33
34    function __construct($it, $max_depth)
35    {
36        $this->max_depth = $max_depth;
37        parent::__construct($it);
38    }
39
40    function rewind(): void
41    {
42        echo __METHOD__ . "\n";
43        $this->skip = false;
44        parent::rewind();
45    }
46
47    function valid(): bool
48    {
49        echo __METHOD__ . "\n";
50        if ($this->skip)
51        {
52            $this->skip = false;
53            $this->next();
54        }
55        return parent::valid();
56    }
57
58    function current(): mixed
59    {
60        echo __METHOD__ . "\n";
61        return parent::current();
62    }
63
64    function key(): mixed
65    {
66        echo __METHOD__ . "\n";
67        return parent::key();
68    }
69
70    function next(): void
71    {
72        echo __METHOD__ . "\n";
73        parent::next();
74    }
75
76    function callHasChildren(): bool
77    {
78        $this->skip = false;
79        $has = parent::callHasChildren();
80        $res = $this->getDepth() < $this->max_depth && $has;
81        echo __METHOD__ . "(".$this->getDepth().") = ".($res?"yes":"no")."/".($has?"yes":"no")."\n";
82        if ($has && !$res)
83        {
84            $this->over++;
85            if ($this->over == 2) {
86                $this->skip = true;
87            }
88        }
89        return $res;
90    }
91
92    function beginChildren(): void
93    {
94        echo __METHOD__ . "(".$this->getDepth().")\n";
95    }
96
97    function endChildren(): void
98    {
99        echo __METHOD__ . "(".$this->getDepth().")\n";
100    }
101}
102
103foreach(new RecursiveArrayIteratorIterator(new MyRecursiveArrayIterator(array("a", array("ba", array("bba", "bbb"), array(array("bcaa"), array("bcba"))), array("ca"), "d")), 2) as $k=>$v)
104{
105    if (is_array($v)) $v = join('',$v);
106    echo "$k=>$v\n";
107}
108?>
109--EXPECT--
110RecursiveArrayIteratorIterator::rewind
111RecursiveArrayIteratorIterator::callHasChildren(0) = no/no
112RecursiveArrayIteratorIterator::valid
113RecursiveArrayIteratorIterator::current
114RecursiveArrayIteratorIterator::key
1150=>a
116RecursiveArrayIteratorIterator::next
117RecursiveArrayIteratorIterator::callHasChildren(0) = yes/yes
118MyRecursiveArrayIterator::getChildren
119RecursiveArrayIteratorIterator::beginChildren(1)
120RecursiveArrayIteratorIterator::callHasChildren(1) = no/no
121RecursiveArrayIteratorIterator::valid
122RecursiveArrayIteratorIterator::current
123RecursiveArrayIteratorIterator::key
1240=>ba
125RecursiveArrayIteratorIterator::next
126RecursiveArrayIteratorIterator::callHasChildren(1) = yes/yes
127MyRecursiveArrayIterator::getChildren
128RecursiveArrayIteratorIterator::beginChildren(2)
129RecursiveArrayIteratorIterator::callHasChildren(2) = no/no
130RecursiveArrayIteratorIterator::valid
131RecursiveArrayIteratorIterator::current
132RecursiveArrayIteratorIterator::key
1330=>bba
134RecursiveArrayIteratorIterator::next
135RecursiveArrayIteratorIterator::callHasChildren(2) = no/no
136RecursiveArrayIteratorIterator::valid
137RecursiveArrayIteratorIterator::current
138RecursiveArrayIteratorIterator::key
1391=>bbb
140RecursiveArrayIteratorIterator::next
141MyRecursiveArrayIterator::valid = false
142RecursiveArrayIteratorIterator::endChildren(2)
143RecursiveArrayIteratorIterator::callHasChildren(1) = yes/yes
144MyRecursiveArrayIterator::getChildren
145RecursiveArrayIteratorIterator::beginChildren(2)
146RecursiveArrayIteratorIterator::callHasChildren(2) = no/yes
147RecursiveArrayIteratorIterator::valid
148RecursiveArrayIteratorIterator::current
149RecursiveArrayIteratorIterator::key
1500=>bcaa
151RecursiveArrayIteratorIterator::next
152RecursiveArrayIteratorIterator::callHasChildren(2) = no/yes
153RecursiveArrayIteratorIterator::valid
154RecursiveArrayIteratorIterator::next
155MyRecursiveArrayIterator::valid = false
156RecursiveArrayIteratorIterator::endChildren(2)
157MyRecursiveArrayIterator::valid = false
158RecursiveArrayIteratorIterator::endChildren(1)
159RecursiveArrayIteratorIterator::callHasChildren(0) = yes/yes
160MyRecursiveArrayIterator::getChildren
161RecursiveArrayIteratorIterator::beginChildren(1)
162RecursiveArrayIteratorIterator::callHasChildren(1) = no/no
163RecursiveArrayIteratorIterator::current
164RecursiveArrayIteratorIterator::key
1650=>ca
166RecursiveArrayIteratorIterator::next
167MyRecursiveArrayIterator::valid = false
168RecursiveArrayIteratorIterator::endChildren(1)
169RecursiveArrayIteratorIterator::callHasChildren(0) = no/no
170RecursiveArrayIteratorIterator::valid
171RecursiveArrayIteratorIterator::current
172RecursiveArrayIteratorIterator::key
1733=>d
174RecursiveArrayIteratorIterator::next
175MyRecursiveArrayIterator::valid = false
176RecursiveArrayIteratorIterator::valid
177MyRecursiveArrayIterator::valid = false
178