-1
votes

PHP pousse un tableau dans une matrice existante par son indice

J'ai du mal à mettre cette question à mettre cette question aux mots si mal simplement simplement à utiliser un exemple simple, espérons que le titre a obtenu mon problème à travers.

Je crée un site de blog sur lequel je peux créer des blogposts et que les gens peuvent poster commentaires. Tout cela est enregistré dans JSON, à l'exception des détails de connexion enregistrés dans MySQL. P>

Sauver les blogposts vont bien, mais j'essaie maintenant de sauvegarder des commentaires. P>

Dites le blogpost La matrice ressemble à ceci: p> xxx pré>

Quelqu'un écrit maintenant un commentaire sur "Second Blogpost", je l'enregistre dans un tableau comme celui-ci (utilisateur tiré de MySQL): P> XXX PRE>

MAINTENANT, je veux les fusionner comme ceci: P>

Array
(
    [0] => Array
        (
            [id] => 0
            [title] => first blogpost
            [content] => blogpost text
        )

    [1] => Array
        (
            [id] => 1
            [title] => second blogpost
            [content] => blogpost 2 text
            [comments] => Array
            (
              [user] => myusername
              [comment] => first post was better!
            )
        )
)


5 commentaires

Chaque élément est en matrice avec sa clé. Votre commentaire (tableau) n'a aucune clé. Où devrait-il être placé?


Quelque chose comme: $ arr [1] ['commentaires'] = $ newarr;


Vous ne pouvez pas avoir ce tableau "flottant" à ce stade comme celui-là, vous devez utiliser une clé pour la stocker sous, identique à celle des autres valeurs id / titre / contenu. Pourrait par exemple être nommé commentaires ...


Cela se sent un peu fragile, si la structure JSON ou Array est votre un véritable magasin, puis tout commentaire a éclaté sur l'un de vos postes de blog met toutes les données à risque. De plus cela pourrait grandir! Pourquoi ne pas utiliser la base de données?


J'ajouterais un horodatage à chaque commentaire, utile pour le tri.


3 Réponses :


0
votes

Si vous aviez une clé associée entre les messages et les commentaires (comme la présentation de post_id dans le tableau de commentaires), cela aurait plus de sens de la fusionner / les mettre.

Je suppose que c'est votre blogpost P>

foreach($comments as $comment){
    $posts[$comment['post_id']]['comments'][]  = $comment;
}


0 commentaires

0
votes

Lorsque le blogpost est mis à jour, je suppose que vous pouvez obtenir l'identifiant de ce blogpost.

Vous pouvez ensuite vérifier si votre structure de données a déjà une clé "Commentaires". Si ce n'est pas le cas, ajoutez la clé et créez une matrice contenant le commentaire et l'utilisateur comme premier tableau.

S'il existe déjà, ajoutez un nouveau tableau avec l'utilisateur et le commentaire afin qu'il puisse y avoir Plusieurs commentaires pour chaque blogpost.

par exemple en utilisant Array_map < / a>: xxx

Démo PHP


2 commentaires

Y a-t-il une différence dans la création d'un tableau comme '$ blogpostss = tableau ();' vs '$ blogpostss = [];'? Parce que j'ai utilisé le premier dans mon code.


@kevinfromspace Vous pouvez simplement utiliser le premier si vous voulez. Celui que j'ai utilisé est un raccourci et je pense que c'est a été introduit en php 5.4



0
votes

Alors je l'ai réparé après un peu de pensée

Ceci est la structure finale: p> xxx pré>

J'ai ajouté un horodatage à cause d'une suggestion ici. C'est aussi une version simplifiée de ce que j'utilise réellement, j'ai essayé d'ajouter de nombreux autres commentaires et de plusieurs postes qui fonctionnent tous deux. P>

Ceci est le code, je devrais mentionner que l'ID est dans l'URL et il est enregistré comme épargné JSON: p> xxx pré>

assez simple jusqu'à présent jusqu'à présent, voici la manière dont la matrice est créée: p> xxx pré>

[$ id] enregistre C'est au bon post, ["Commentaires"] l'enregistre à la touche Commentaires (ou la crée) et le dernier [] donne chaque commentaire un index différent à l'intérieur des ["Commentaires"]. P>

$newJSON = json_encode($currentArray, JSON_PRETTY_PRINT);
file_put_contents($filename, $newJSON);


0 commentaires