Quelle méthode pour les arrays ?

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

c'est une question bizarre (désolé :D) mais j'aimerais quand même savoir quelle est la manière la plus optimisée/pro/propre de réaliser cette expérience.

Imaginons que je cherche à stocker des informations dans un array de sorte à afficher :

  • TITRE 1
  • sous titre 1
  • sous titre 2
  • TITRE 2
  • sous titre 1
  • sous titre 2
  • sous titre 3

et ainsi de suite.

Sachant que le nombre de "sous-titres" par partie est variables, donc il vaut mieux passer par un tableau.

J'ai pensé à deux méthodes.

Méthode 1

1
<?php $array = array("Titre 1" => array("Sous-titre 1", "Sous-titre 2")); ?>

Méthode 2

1
<?php $array = array(array("Titre 1", array("Sous-titre 1", "Sous-titre 2"))); ?>

Quelle méthode vous semble la plus propre ?

Je pencherais pour la seconde, qui n'utilise pas les clés d'arrays (keys) et laisse me laisse donc la possibilité d'accéder aux valeurs en utilisant leur numéro d'identification.

Si je faisais un print_r j'aurais certainement un truc du genre :

1
2
3
4
5
6
7
8
9
 Array
 (
     [Titre 1] => Array
         (
             [0] => Sous-titre 1
             [1] => Sous-titre 2
         )

 )

pour la première

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 Array
 (
     [0] => Array
         (
             [0] => Titre 1
             [1] => Array
                 (
                     [0] => Sous-titre 1
                     [1] => Sous-titre 2
                 )

         )

 )

pour la seconde.

Qu'en pensez-vous ?

Merci de vos réponses.

Édité par SEWERFan

+0 -0

Projette toi sur les opérations que tu veux faire au final, laquelle te parait la plus adaptée et la plus évolutive ? Et d'ailleurs, pourquoi un array et pas un objet ?

PS: le titre du topic n'est pas très parlant.

Édité par yoch

+2 -0

Tout dépend de ce que tu comptes faire. De manière générale, ce sera toujours un ensemble d'ensemble.

Les différentes implémentations dépendent de ton application (heap, stack, list, array, dictionnary, linked list, etc.)

EDIT : Aussi, une simple liste sera suffisant tu sais. Ce n'est pas avec ce genre de micro-optimisations que tu aura un gain quelconque d'après moi.

Édité par Mourad_Akandouch

+0 -1

Personnellement j'aurais fait :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

$data = [
    [
        'title' => 'Titre 1',
        'subtitles' => [
            'A',
            'B',
            'C'
        ]
    ], [
        'title' => 'Titre 2',
        'subtitles' => [
            'A',
            'B',
            'C',
            'D'
        ]
    ]
];

Édité par Syl

Desolation sur le SdZ | GitHub | Twitter

+1 -0
Auteur du sujet

Merci de vos réponses.

EDIT : Aussi, une simple liste sera suffisant tu sais. Ce n'est pas avec ce genre de micro-optimisations que tu aura un gain quelconque d'après moi.

Une simple liste, c'est-à-dire ?

Personnellement j'aurais fait :

```php <?php

$data = [ [ 'title' => 'Titre 1', 'subtitles' => [ 'A', 'B', 'C' ] ], [ 'title' => 'Titre 2', 'subtitles' => [ 'A', 'B', 'C', 'D' ] ] ];

Je pensais faire ça aussi au début mais ça paraît assez redondant, surtout que les clés (keys) 'title' et 'subtitles' n'auront pas d'utilité.

+0 -0

La seconde possède le lourd inconvénient de particulariser les choses: $array[0] c'est le "Titre 1" (déjà, ça part mal mais passons), $array[0][0], c'est le titre (nombre 0 magique) et $array[0][1], c'est les sous-titres. Pourquoi pas de $array[0][2] plus tard? Et pour l'itération, ce sera compliqué (pas de array_walk_recursive possible).

1
2
3
4
5
6
class Section {
    /** @var string $title */
    public $title;
    /** @var Section[] $subsection */
    public $subsections;
}

C'est bien plus agréable.

L'array 'title' => ..., 'subtitle' => ... n'en est qu'un déguisement, qui se justifie éventuellement si tu as besoin d'envoyer cela en JSON (json_encode direct).

+1 -0

Salut !

J'aurais des questions pour l'auteur du sujet.

  1. Est-ce que cette structure/hiérarchie est appelée à changer beaucoup (déplacements, insertions en des endroits précis) ?
  2. Est-ce que cette structure doit être enregistrée quelque part ?
  3. Est-ce que cette structure sera affichée plus souvent que modifiée ?

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

La seconde possède le lourd inconvénient de particulariser les choses: $array[0] c'est le "Titre 1" (déjà, ça part mal mais passons), $array[0][0], c'est le titre (nombre 0 magique) et $array[0][1], c'est les sous-titres. Pourquoi pas de $array[0][2] plus tard? Et pour l'itération, ce sera compliqué (pas de array_walk_recursive possible).

1
2
3
4
5
6
class Section {
    /** @var string $title */
    public $title;
    /** @var Section[] $subsection */
    public $subsections;
}

C'est bien plus agréable.

L'array 'title' => ..., 'subtitle' => ... n'en est qu'un déguisement, qui se justifie éventuellement si tu as besoin d'envoyer cela en JSON (json_encode direct).

Xenos

  • $array[0] c'est le premier array.
  • $array[0][0] c'est "Titre 1" (le nom du titre).
  • $array[0][1] c'est l'array contenant les sous-titres en rapport avec "Titre 1".

Est-ce que cette structure/hiérarchie est appelée à changer beaucoup (déplacements, insertions en des endroits précis) ?

De légères insertions, mais uniquement par "gros bloc" c'est à dire ajouter des "Titre X" + le tableau correspondant, je ne pense pas qu'il y ait d'insertions ou modifications de sous-titres déjà existants (donc le "second" array est à peu près fixé).

Est-ce que cette structure doit être enregistrée quelque part ?

Non, juste dans le fichier PHP initial.

Est-ce que cette structure sera affichée plus souvent que modifiée ?

Oui. Très peu de modifications à prévoir.

merci de vos réponses.

Édité par SEWERFan

+0 -0

Si je comprend bien, les données seront enregistrées a la main dans un fichier PHP ? Et les ajouts / suppressions se feront a la main ?

Dans ce cas, j'aurais peut-être employé JSON (je n'aime pas stocker des données en PHP, même si c'est parfois bien pratique. utiliser un format universel me donne plus de souplesse en cas de changement).

Quel sera exactement l'usage final de ces donnes (simple affichage / autre) ?

Édité par yoch

+0 -0

Bon, alors je pense qu'utiliser quelques index textuels ne sera pas de trop, parce qu'uniquement des index "naturels" et numériques, c'est très souple à l'insertion, mais pas très simple à gérer à l'affichage. En conséquence, je propose une structure telle que la suivante.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
$bibliotheque = [
    [
        'title' => 'Un titre',
        'parts' => [
            [
                'title' => 'Un autre titre',
                'parts' => [],
            ],[
            [
                'title' => 'Encore un autre titre',
                'parts' => [
                    [
                        'title' => 'Et un dernier pour l\'exemple',
                        'parts' => [],
                    ],
                 ]
            ],
            // … Est-ce que c'est assez clair ?

Un exemple de hiérarchie

Du coup, avec ça, tu as toujours un titre et tu peux toujours boucler sur les parties, quel que soit le niveau. Ça rejoint un peu l'idée du JSON et celle donnée par Syl, mais c'est du PHP et c'est "générique", dans le sens où tu peux avoir autant de niveaux que tu le souhaites.

En revanche, mieux vaut savoir combien à l'avance et s'y limiter. Sans quoi, il faudra probablement utiliser une autre méthode pour décomplexifier l'algorithme de rendu — il existe une manière qui permet de gérer un tableau d'une seule dimension, tout en conservant une hiérarchie des éléments qui s'y trouvent, si jamais. Mais c'est pas forcément simple à appréhender, et demande plus de travail à l'insertion.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+1 -0

Si le but est simplement l'affichage, ce sera beaucoup plus facile avec la structure ci-dessous. Pour rappel, contrairement à d'autres langages, en PHP l'ordre des éléments dans un tableau associatif est garanti.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$data = [
'Titre 1'=>1,
'Sous-titre 1.1'=>2,
'Sous-titre 1.2'=>2,
'Sous-titre 1.3' => 2,
'Titre 2' => 1,
'Sous-titre 2.1' => 2,
...
];

Affichables très facilement avec :

1
2
<?php
foreach ($data as $titre=>$niuveau) echo "<h$niveau>$titre</h$niveau>";

Si tu es amené à faire autre chose que purement de l'affichage, ou si la structure est amenée à évoluée, je me range avec les avis précédents: OOP > all, ou sinon JSON, YAML ou XML (tu peux même aller les deux).

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+1 -0

Si je comprend bien, les données seront enregistrées a la main dans un fichier PHP ? Et les ajouts / suppressions se feront a la main ?

Un XML te permettra de faire une XSD pour valider automatiquement ce XML (ce qui évite les modifications foireuses) et avoir l'auto-complétion (dans NetBeans par exemple). Après, au choix: tu "pré-compile" cela pour en sortir un tableau comme tu le sens (ce qui te permettra d'ailleurs de changer de structure de tableau sans modifier le XML) ou tu charges le fichier menu dans un DOMDocument à la volée.

(et oui, j'ai mal exprimé le "Titre1" pour $array[0], j'aurai du dire "Section 1")

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte