Как добавить данные массива комментариев внутрь массива постов в соответствии с postid в php?

1

У меня есть массив массивов результатов и комментариев результатов следующим образом

$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?

  • 0
    Это не должно быть слишком сложно, если вы немного читаете о циклах, ассоциативных массивах и т. Д. Чтобы помочь немного: переберите каждый элемент $ postarray и добавьте к нему новое свойство «comments» (пустой массив). Затем используйте индексы в этом цикле, чтобы получить ваши комментарии внутри ...
Теги:
arrays
pdo

5 ответов

2
Лучший ответ

Вы можете использовать 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());
  • 1
    Я думаю, что OP будет трудно понять ваш код, так как это должно быть довольно легкой задачей :) Хотя хорошая работа.
  • 0
    Хорошо быть тяжелым .. Может быть, он узнает что-то новое .. и если будет трудно .. наверняка он вспомнит это позже :)
Показать ещё 5 комментариев
0

Сделайте это, как сначала получить все сообщения, а затем в цикле 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;
0

Вы можете использовать так:

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

                )

        )

)
0

для этого вы можете использовать эту функцию:

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);
0

На этой неделе у меня такой же опыт с форматированием моих данных, как вы хотите это сделать.

вот следующее решение, которое я получил:

<?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) ; чтобы узнать, отформатирован ли он так, как вы хотите!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню