La meilleure façon d'organiser vos données seraient de telle manière:
array (
'Animal' =>
array (
'Turtle' =>
array (
'Sea Turtle',
'Box Turtle',
'Green Turtle' =>
array (
'Green Turtle With Brown Tail',
),
'Common Turtle',
),
),
);
// Or, otherwise written (equivalent to the above)
$animals = array();
$animals['Animal'] = array();
$animals['Animal']['Turtle'] = array();
$animals['Animal']['Turtle'][] = 'Sea Turtle';
$animals['Animal']['Turtle'][] = 'Box Turtle';
$animals['Animal']['Turtle']['Green Turtle'] = array();
$animals['Animal']['Turtle']['Green Turtle'][] = 'Green Turtle With Brown Tail';
$animals['Animal']['Turtle'][] = 'Common Turtle';
Essentiellement, le nom de l'animal est la valeur, à moins qu'il a des enfants, la valeur est un tableau et la clé est le nom de l'animal.
De cette façon, vous pouvez facilement analyser les valeurs en procédant comme suit:
parse_animals($animals);
function parse_animals($array, $indent = 0) {
if(!is_array($array)) return; // A little safe guard in case.
foreach($array as $key => $value) {
echo str_repeat(' ', $indent) . "- ";
if(is_array($value)) {
echo $key . "\n";
parse_animals($value, $indent + 1);
} else {
echo $value . "\n";
}
}
}
ci-dessus dans la console affichera les éléments suivants:
- Animal
- Turtle
- Sea Turtle
- Box Turtle
- Green Turtle
- Green Turtle With Brown Tail
- Common Turtle
EDIT: Et voici une version qui le sortira pour une page Web.
function parse_animals_web($array) {
if(!is_array($array)) return; // A little safe guard in case.
foreach($array as $key => $value) {
echo '<ul>';
if(is_array($value)) {
echo '<li>' . htmlentities($key) . "</li>";
parse_animals_web($value);
} else {
echo '<li>' . htmlentities($value) . "</li>";
}
echo '</ul>';
}
}
La sortie est:
- animaux
- tortue
- Sea Turtle
- tortue de boîte
- Green Turtle
- tortue verte avec Brown Tail
- Tortue commune
Peut-être que vous voulez obtenir les enfants d'un animal.
function get_children_of($array, $name) {
foreach($array as $key => $value) {
if(is_array($value)) {
if($key === $name) {
return $value;
} else {
return get_children_of($value, $name);
}
}
}
return array();
}
Maintenant, nous pouvons obtenir tous les enfants du Green Turtle
et les sorties.
$green_turtle = get_children_of($animals, 'Green Turtle');
parse_array($green_turtle);
La sortie est:
- Green Turtle With Brown Tail
EDIT: Puisque vous dites que vous êtes coincé avec le tableau d'entrée étant dans ce format bizarre, voici une fonction qui vous permet de convertir votre tableau dans le format que j'ai spécifié ci-dessus:
function convert_array($array) {
$new_array = array();
$keys = array_keys($array);
foreach($keys as $key) {
$level = explode('-', $key);
$cur_level = &$new_array;
$cur_key = '';
foreach($level as $o_key) {
$cur_key = ltrim($cur_key . '-' . $o_key, '-');
$next_key = $cur_key . '-1';
$value = $array[$cur_key];
$has_child = array_key_exists($next_key, $array);
if($has_child) {
if(!array_key_exists($value, $cur_level)) {
$cur_level[$value] = array();
}
$cur_level = &$cur_level[$value];
} else {
$cur_level[] = $value;
}
}
}
return $new_array;
}
Vous utilisez un tableau typé pour gérer les données tabulaires/hiérarchiques. J'ai une intuition il y aura plus (tortue, tatou, iquana), et que la récursivité peut continuer (avec des taches de rousseur, avec des champignons de la queue). Mais vous n'avez pas mentionné le stockage de base de données. Je me demande si vous avez envisagé d'utiliser XML? Avez-vous manipulé des données hiérarchiques en dehors de PHP? (Vous dites que vous savez que ce n'est pas facile, mais savez-vous vraiment comment "pas facile" c'est?!) – Smandoli
Eh bien, la solution de mon cas sera ajouté à une classe plus grande qui est une sorte d'analyseur de texte, et j'ai besoin pour construire cet arbre à partir de texte écrit ici et là dans un grand champ de texte (d'une base de données) et l'utilisateur ne doit pas écrire ces choses 1-1-2 mais il est généré à partir d'une autre fonction qui lit le texte et le comprend alors donne ce tableau. donc il n'est pas possible d'envisager xml ici je pense .. –