У меня есть массив массивов результатов и комментариев результатов следующим образом
$postarray = $this->db->query("SELECT * FROM posts");
$postids = implode('',$postarray['post_id']);
$comments = $this->db->query("SELECT * FROM comments WHERE post_id IN ({$postids})");
$postarray
выглядит примерно так:
Array(
[0] => Array
(
[post_id] => 10
[user_id] => 24
[content] => blah
)
[1] => Array
(
[post_id] => 11
[user_id] => 2
[content] => blah....
)
)
$comments
:
Array(
[0] => Array
(
[com_id] => 1
[post_id] => 10
[user_id] => 2
[content] => blah
)
[1] => Array
(
[com_id] => 4
[post_id] => 11
[user_id] => 7
[content] => blah....
)
........................
)
Я хочу добавить данные $comments
в $postarray
следующим образом:
Array(
[0] => Array
(
[post_id] => 10
[user_id] => 24
[content] => blah
[comments] => Array(
[0] => Array
(
[com_id] => 1
[post_id] => 10
[user_id] => 2
[content] => blah
)
[1] => Array
(
[com_id] => 8
[post_id] => 10
[user_id] => 7
[content] => blah....
)
)
)
[1] => Array
(
[post_id] => 11
[user_id] => 2
[content] => blah....
[comments] =>
)
)
Как добавить $postarray
с такими $comments
?
Вы можете использовать array_reduce
:
$posts = array_reduce($posts, function ($result, $post) use ($comments) {
$post['comments'] = array();
foreach ($comments as $comment) {
if ($comment['post_id'] != $post['post_id']) {
continue;
}
$post['comments'][] = $comment;
}
$result[] = $post;
return $result;
}, array());
Сделайте это, как сначала получить все сообщения, а затем в цикле for получить комментарии для каждого сообщения.
$output = array();
$postarray = $this->db->query("SELECT * FROM posts");
foreach($postarray as $post)
{
$post['comments'] = $this->db->query("SELECT * FROM comments WHERE post_id = ({$post->id})");
$output[] = $post;
}
return $output;
Вы можете использовать так:
$post = array(
array(
'post_id'=>10,
'user_id'=>24,
'content'=>'blah'
),
array(
'post_id'=>11,
'user_id'=>2,
'content'=>'blah'
)
);
$comments = array(
array(
'com_id'=>1,
'post_id'=>10,
'user_id'=>24,
'content'=>'blah'
),
array(
'com_id'=>1,
'post_id'=>11,
'user_id'=>24,
'content'=>'blah'
)
);
$expectedArr = array();
$i = 0;
foreach ($post as $key => $value) {
$expectedArr[$i]['post_id'] = $value['post_id'];
$expectedArr[$i]['user_id'] = $value['user_id'];
$expectedArr[$i]['content'] = $comments[$i]['content'];
$expectedArr[$i]['comments'] = $comments;
$i++;
}
echo "<pre>";
print_r($expectedArr);
Результат:
Array
(
[0] => Array
(
[post_id] => 10
[user_id] => 24
[content] => blah
[comments] => Array
(
[0] => Array
(
[com_id] => 1
[post_id] => 10
[user_id] => 24
[content] => blah
)
[1] => Array
(
[com_id] => 1
[post_id] => 11
[user_id] => 24
[content] => blah
)
)
)
[1] => Array
(
[post_id] => 11
[user_id] => 2
[content] => blah
[comments] => Array
(
[0] => Array
(
[com_id] => 1
[post_id] => 10
[user_id] => 24
[content] => blah
)
[1] => Array
(
[com_id] => 1
[post_id] => 11
[user_id] => 24
[content] => blah
)
)
)
)
для этого вы можете использовать эту функцию:
function array_extend($a, $b) {
foreach($b as $k=>$v) {
if( is_array($v) ) {
if( !isset($a[$k]) OR isset($v[0])) {
$a[] = $v;
} else {
$a[] = array_extend($a[$k], $v);
}
} else {
$a[] = $v;
}
}
return $a;
}
Область применения:
$array = array_extend($orig_array,$new_array);
На этой неделе у меня такой же опыт с форматированием моих данных, как вы хотите это сделать.
вот следующее решение, которое я получил:
<?php
foreach ($postarray as $postArrayRow) {
foreach ($comments as $commentRow) {
if ($postarrayRow['id'] == $commentRow['post_id']) {
if(array_key_exists($postarrayRow['comments'], $postArrayRow)){
postarrayRow['comments'] = array(commentRow);
}
$postarrayRow['comments'][] = $commentRow ;
}
}
}
Скажи мне, хорошо ли это для тебя. И попробуйте print_r($postarray) ;
чтобы узнать, отформатирован ли он так, как вы хотите!