2010-09-23 10 views
-1

J'ai la prochaine série hiérarchie:php obtenir de sous-tableau tableau suivant les clés

Array(
[1005] => Array(
       [1000] => Array(
           [1101] => ... 
           [1111] => ... 
          ) 
       ) 
) 

Dans ma fonction, j'envoie Id $. Et ma tâche de retourner un tableau par cet ID. Par exemple: getArray(1000) devrait revenir le prochain tableau:

Array(
            [1101] => ... 
            [1111] => ... 
           ) 

Comment puis-je faire cela? Merci.

+0

Medoo? http://stackoverflow.com/questions/3776798/php-array-recursion – Wernight

+0

C'est la prochaine tâche. – pltvs

+0

Ensuite, la question devrait être marquée avec 'tâche' ou 'exercice' ou écrite d'une manière qui montre que ce n'est pas une question personnelle mais un exercice. – Wernight

Répondre

5

Voici une implémentation récursive de getArray:

function getArray($array, $index) { 
    if (!is_array($array)) return null; 
    if (isset($array[$index])) return $array[$index]; 
    foreach ($array as $item) { 
     $return = getArray($item, $index); 
     if (!is_null($return)) { 
      return $return; 
     } 
    } 
    return null; 
} 

Et voici une implémentation itérative de getArray:

function getArray($array, $index) { 
    $queue = array($array); 
    while (($item = array_shift($queue)) !== null) { 
     if (!is_array($item)) continue; 
     if (isset($item[$index])) return $item[$index]; 
     $queue = array_merge($queue, $item); 
    } 
    return null; 
} 
+0

+1 pour me battre à la méthode itérative –

3

Et une réponse qui utilise le recursive iterator:

function getArray($array, $index) { 
    $arrayIt = new RecursiveArrayIterator($array); 
    $it = new RecursiveIteratorIterator(
     $arrayIt, 
     RecursiveIteratorIterator::SELF_FIRST 
    ); 
    foreach ($it as $key => $value) { 
     if ($key == $index) { 
      return $value; 
     } 
    } 
    return null; 
} 

Ou, si vous voulez vraiment avoir envie, vous pouvez d utiliser un filter iterator:

class IndexFilterIterator extends FilterIterator { 
    protected $index = ''; 
    public function __construct($iterator, $index) { 
     $this->index = $index; 
     parent::__construct($iterator); 
    } 
    public function accept() { 
     return parent::key() == $index; 
    } 
} 

function getArray($array, $index) { 
    $arrayIt = new RecursiveArrayIterator($array); 
    $it = new RecursiveIteratorIterator(
     $arrayIt, 
     RecursiveIteratorIterator::SELF_FIRST 
    ); 
    $filterIt = new IndexFilterIterator($it, $index); 
    $filterIt->rewind(); 
    if ($filterIt->valid()) { 
     return $filterIt->current(); 
    } 
    return null; 
} 
+0

Merci cela a fonctionné pour moi :) –

Questions connexes