我在将这个问题放在单词上时遇到了麻烦,请仅使用一个简单的例子,希望标题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的几个变体,但最终总是替换了相关的博客文章,而不是添加到博客文章中。
编辑:有人指出新数组不能随便浮动,我认为现在更好了。
答案 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);
答案 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。
希望这对某人有帮助。