Я опишу (некоторые из) константы классов со страницы , на которую вы ссылаетесь , затем подниму еще несколько пунктов.
Режимы итераций RecursiveIteratorIterator
Режим итерации RecursiveIteratorIterator::LEAVES_ONLY
. (Это режим по умолчанию .)
Этот режим итерации (один из трех) ограничивает элементы, доступные во время итерации, только «листьями» (представьте, что рекурсивная структура - это дерево с рядом ветвей, растущих на других ветвях или, в случае отсутствия ветвей, имея листья на конце). В массиве array('a'=>array('b','c'),'d','e'=>array('f','g'))
листья: b
, c
, d
, f
и g
, поскольку они находятся в конце, они больше не прорастают.
Чтобы получить фрагмент кода, показывающий этот режим в действии (будет серия примеров с одним и тем же итератором рекурсивного массива с рекурсивным итератором итератора, использующим разные режимы и флаги):
$array = array('a'=>array('b','c'),'d','e'=>array('f','g'));
$ait = new RecursiveArrayIterator($array);
// Only iterate over leaves
$rit = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($rit as $item) {
echo $item;
}
// Output: bcdfg
Режим итерации RecursiveIteratorIterator::SELF_FIRST
.
Этот режим итерации указывает итератору, что «родительские» элементы (то есть не листья) должны быть размещены перед их дочерними элементами (если они есть) при итерации.
// Parents come first
$rit = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::SELF_FIRST);
foreach ($rit as $key => $item) {
if (is_array($item)) echo "[$key]"; // parent
else echo $item; // child
}
// Output: [a]bcd[e]fg
Режим итерации RecursiveIteratorIterator::CHILD_FIRST
.
Этот итерационный режим меняет местами родительские / дочерние позиции, так что дочерние элементы (листья) идут первыми, а затем родительские, как показано:
// Children first
$rit = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($rit as $key => $item) {
if (is_array($item)) echo "[$key]"; // parent
else echo $item; // child
}
// Output: bc[a]dfg[e]
Другие баллы
Флаги конструктора RecursiveIteratorIterator
Это только константы для трех режимов (только листья, сначала родитель или потомок сначала) итерации по рекурсивным итераторам. RecursiveIteratorIterator также имеет аргумент flags
, который влияет на другое поведение, например, останавливаться ли, если дочерний объект вызывает исключение, вызывать ли __toString
для элементов и т. Д. (Флаги - это CachingIterator
константы, которые одинаково недокументированы ).
Другие константы SPL
Это связано с моим следующим пунктом. Не существует единой единой точки, в которой перечислены все константы, доступные по всему SPL: большинство классов даже не перечисляют свои собственные константы. Однако вы можете использовать отражение , чтобы взглянуть на доступные константы. В командной строке используйте что-то вроде php --rc recursiveiteratoriterator | grep -i constant
, чтобы увидеть список констант RecursiveIteratorIterator.
Отсутствие документации
Документация, доступная в руководстве по PHP, написана (в значительной степени) полностью добровольцами. SPL, в частности, является больным местом, где еще предстоит проделать огромную работу, прежде чем эта область будет в форме корабля и соответствует стандартам. Если кто-то хочет помочь в этом (не уверен, что SO рассмотрит эту рекламу?), Тогда свяжитесь со мной (salathe@php.net) или подпишитесь на список рассылки документации PHP (отправьте пустое электронное письмо по адресу phpdoc-subscribe@lists.php .net) и застрять. Чем больше, тем лучше.