代码之家  ›  专栏  ›  技术社区  ›  Marcus

如何在这里获得查询的整个结果集?

  •  0
  • Marcus  · 技术社区  · 16 年前

    function get_book_info() {
    
    /*
     * SELECT b.isbn, b.title, b.publisher, b.date, b.thumb, b.filename, b.pages, t.tag
     * FROM books AS b
     * INNER JOIN books_tags AS bt ON b.isbn = bt.book_id
     * INNER JOIN tags AS t ON bt.tag_id = t.id
     * ORDER BY b.title, t.tag
     */
    
    $this->db->select('b.isbn, b.title, b.publisher, b.date, b.thumb, b.filename, b.pages, t.tag');
    $this->db->from('books AS b');
    $this->db->join('books_tags AS bt', 'b.isbn = bt.book_id', 'inner');
    $this->db->join('tags AS t', 'bt.tag_id = t.id', 'inner');
    $this->db->order_by('b.title, t.tag');
    $query = $this->db->get();
    $result = $query->result();
    
    $counter = '';
    $record = $meta = $tags = array();
    foreach ($result as $book) {
        // If this is the first appearance of this book
        if ($counter != $book->isbn) {
            // If the meta array already exists
            if ($meta) {
                // Add the combined tag string to the meta array
                $meta['tags'] = implode(', ', $tags);
                // Add the meta array
                $record[] = $meta;
                // Empty the tags array
                $tags = array();
            }
            // Reset the counter
            $counter = $book->isbn;
            // Grab the book from Amazon
            $amazon = $this->amazon->get_amazon_item($book->isbn);
            // Collect the book information
            $meta = array(
                'isbn' => $book->isbn,
                'title' => strip_slashes($book->title),
                'publisher' => strip_slashes($book->publisher),
                'date' => date('F j, Y', strtotime($book->date)),
                'thumb' => $book->thumb,
                'filename' => $book->filename,
                'pages' => $book->pages,
                'rating' => $amazon->Items->Item->CustomerReviews->AverageRating,
                'raters' => $amazon->Items->Item->CustomerReviews->TotalReviews
            );
            // Add the tag to the tags array
            $tags[] = $book->tag;
        } else {
            // All we need is the tag
            $tags[] = $book->tag;
        }
    }
    
    return $record;
    }
    

    这段代码只适用于最后一本书——它总是漏掉最后一行。我知道它为什么会这样,但我不知道怎么解决它。这里有一些我尝试过的方法,但是仍然没有将最后一本书包含在$record数组中。

    function get_book_info() {
    
        /*
         * SELECT b.isbn, b.title, b.publisher, b.date, b.thumb, b.filename, b.pages, t.tag
         * FROM books AS b
         * INNER JOIN books_tags AS bt ON b.isbn = bt.book_id
         * INNER JOIN tags AS t ON bt.tag_id = t.id
         * ORDER BY b.title, t.tag
         */
    
        $this->db->select('b.isbn, b.title, b.publisher, b.date, b.thumb, b.filename, b.pages, t.tag');
        $this->db->from('books AS b');
        $this->db->join('books_tags AS bt', 'b.isbn = bt.book_id', 'inner');
        $this->db->join('tags AS t', 'bt.tag_id = t.id', 'inner');
        $this->db->order_by('b.title, t.tag');
        $query = $this->db->get();
        $result = $query->result();
    
        $counter = '';
        $record = $meta = $tags = array();
        $count = count($result);
        $i = 0;
    
        foreach ($result as $book) {
            // If this is not the last row
            if ($i < $count) {
                // If this is the first appearance of this book
                if ($counter != $book->isbn) {
                    // If the meta array already exists
                    if ($meta) {
                        // Add the combined tag string to the meta array
                        $meta['tags'] = implode(', ', $tags);
                        // Add the meta array
                        $record[] = $meta;
                        // Empty the tags array
                        $tags = array();
                    }
                    // Reset the counter
                    $counter = $book->isbn;
                    // Grab the book from Amazon
                    $amazon = $this->amazon->get_amazon_item($book->isbn);
                    // Collect the book information
                    $meta = array(
                        'isbn' => $book->isbn,
                        'title' => strip_slashes($book->title),
                        'publisher' => strip_slashes($book->publisher),
                        'date' => date('F j, Y', strtotime($book->date)),
                        'thumb' => $book->thumb,
                        'file' => $book->filename,
                        'pages' => $book->pages,
                        'rating' => $amazon->Items->Item->CustomerReviews->AverageRating,
                        'raters' => $amazon->Items->Item->CustomerReviews->TotalReviews
                    );
                    // Add the tag to the tags array
                    $tags[] = $book->tag;
                } else {
                    // All we need is the tag
                    $tags[] = $book->tag;
                }
            // If this is the last row
            } else {
                // If this is the first appearance of this book
                if ($counter != $book->isbn) {
                    // Grab the book from Amazon
                    $amazon = $this->amazon->get_amazon_item($book->isbn);
                    // Collect the book information
                    $meta = array(
                        'isbn' => $book->isbn,
                        'title' => strip_slashes($book->title),
                        'publisher' => strip_slashes($book->publisher),
                        'date' => date('F j, Y', strtotime($book->date)),
                        'thumb' => $book->thumb,
                        'file' => $book->filename,
                        'pages' => $book->pages,
                        'rating' => $amazon->Items->Item->CustomerReviews->AverageRating,
                        'raters' => $amazon->Items->Item->CustomerReviews->TotalReviews
                    );
                    // Add the tag to the tags array
                    $tags[] = $book->tag;
                    // Add the combined tag string to the meta array
                    $meta['tags'] = implode(', ', $tags);
                    // Add the meta array
                    $record[] = $meta;
                } else {
                    // All we need is the tag
                    $tags[] = $book->tag;
                    // Add the combined tag string to the meta array
                    $meta['tags'] = implode(', ', $tags);
                    // Add the meta array
                    $record[] = $meta;
                }
            }
            $i++;
        }
    
        return $record;
    }
    

    有什么建议吗?我该怎么解决这个问题?

    1 回复  |  直到 16 年前
        1
  •  0
  •   Marcus    16 年前

    我想出来了。在第二个例子中我几乎正确,我只需要将我的$I计数器初始化为1而不是0

    $i = 1;