Question

J'itérer un tableau multidimensionnel avec RecursiveIteratorIterator et voudrais être en mesure de savoir si l'élément courant est le dernier enfant de celui-ci de profondeur. Je pensais à ceci:

$iterator = new RecursiveIteratorIterator($array,
  RecursiveIteratorIterator::SELF_FIRST);    
foreach ($iterator as $val) {
  $next = clone $iterator;
  $next->next();
  $lastChild = ($next->getDepth() < $iterator->getDepth());
}

Mais le RecursiveIteratorIterator dit que ce n'est pas cloneable.

Était-ce utile?

La solution

L'expression « dernier enfant de sa profondeur » est pas particulièrement claire. Pourriez-vous préciser exactement ce que vous voulez dire; l'utilisation prévue pour cela?

Si vous voulez dire, tout simplement, que la profondeur changera après l'élément courant, le (Recursive)CachingIterator a une méthode hasNext pratique pour déterminer si l'itérateur a d'autres éléments. Pour donner un exemple édulcorée similaire à celle de la question:

$array  = array(
    range(1,6),
    range(7,8),
    'foo' => range(1,3),
    'bar' => range(4,5),
);

$rit = new RecursiveArrayIterator($array);
$iterator = new RecursiveIteratorIterator(
    new RecursiveCachingIterator($rit),
    RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($iterator as $val) {
    $lastChild = !$iterator->hasNext();
    if ($lastChild) {
        echo "$val is the last child!\n";
    }
}

Sorties:

6 is the last child!
8 is the last child!
3 is the last child!
5 is the last child!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top