php通过索引将数组推入现有数组

时间:2019-01-16 10:22:08

标签: php arrays multidimensional-array

我在将这个问题放在单词上时遇到了麻烦,请仅使用一个简单的例子,希望标题sortof可以解决我的问题。

我正在创建一个博客网站,我可以在其中创建博客文章,人们可以发表评论。除了登录详细信息(保存在MySQL中)之外,所有这些都保存在JSON中。

现在可以保存博客文章了,但是我现在要保存评论。

让我们说Blogpost数组看起来像这样:

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

    [1] => Array
        (
            [id] => 1
            [title] => second blogpost
            [content] => blogpost 2 text
        )
)

现在有人在“第二篇博客文章”上发表评论,我将其保存到这样的数组中(用户来自MySQL):

Array
(
    [user] => myusername
    [comment] => first post was better!
)

现在我要像这样合并它们:

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!
            )
        )
)

我尝试搜索了一段时间,但我希望它已经出现在网站上的某个位置,但找不到。我尝试了array_push和array_merge的几个变体,但最终总是替换了相关的博客文章,而不是添加到博客文章中。

编辑:有人指出新数组不能随便浮动,我认为现在更好了。

3 个答案:

答案 0 :(得分:0)

如果您在帖子和评论之间有任何相关的键(例如在comment数组中包含post_id),则将它们合并/放置会更有意义。

我认为这是您的博客文章

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

        [1] => Array
            (
                [id] => 1
                [title] => second blogpost
                [content] => blogpost 2 text
            )
    )

您的评论应类似于:

 Array
    (
        [user] => myusername
        [comment] => first post was better!
        [post_id] => 1
    )

这样,您将能够找到匹配的博客文章。

但是,在数据结构之外,这是一个将项目合并到数组数组元素中的示例。

一个嵌套循环示例。

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

这里的关键是通过&$post将元素的每个引用发送到循环中,然后在循环中对其进行操作。

使用索引数组。 (就像您已经将索引名作为post_id和将注释索引作为空数组一样)

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

答案 1 :(得分:0)

博客文章更新后,我认为您可以获取该博客文章的ID。

然后,您可以检查您的数据结构是否已包含关键的“注释”。如果没有,请添加密钥并创建一个包含注释和用户的数组作为第一个数组。

如果已经存在,请为用户和评论添加一个新数组,以便每个博客文章可以有多个评论。

例如,使用array_map

$blogPosts = array_map(function ($blogPost) use ($blogPostId, $comment) {
    if ($blogPost["id"] === $blogPostId) {
        isset($blogPost["comments"]) ? $blogPost["comments"][] = $comment : $blogPost["comments"] = [$comment];
        return $blogPost;
    }
    return $blogPost;

}, $blogPosts);

Php demo

答案 2 :(得分:0)

所以我经过一番思考后将其修复

这是最终结构:

Array
(
[0] => Array
    (
        [id] => 0
        [title] => 1st post
        [content] => 1st post works!
        [date] => 21-01-2019
        [comments] => Array
            (
                [0] => Array
                    (
                        [user] => Me
                        [comment] => hey 1
                        [date] => 12:02 21-01-2019
                    )

                [1] => Array
                    (
                        [user] => Me
                        [comment] => hey 2
                        [date] => 12:03 21-01-2019
                    )

            )

    )
)

由于这里的建议,我添加了时间戳。这也是我实际使用的简化版本,我尝试添加更多评论并在多篇文章中均起作用。

这是代码,我应该提到ID在URL中,并保存为JSON:

$filename = file.json;
$currentArray = json_decode(file_get_contents($filename), true);

$comment = $_POST['comment'];
$username = $_SESSION['username'];
$date = date("H:i d-m-Y");
$id = $_GET['id'];

到目前为止,非常简单,这是创建数组的方式:

$currentArray[$id]["comments"][] = array (
  'user' => $username,
  'comment' => $comment,
  'date' => $date
);

[$ id]将其保存到正确的帖子中,[“ comments”]将其保存到注释键(或创建它),最后一个[]在[“ comments”]中给每个注释一个不同的索引。 / p>

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

最后将其编码并保存到JSON。

希望这对某人有帮助。