【问题标题】:Handling php row values and grouping PHP MYSQL WHILE & Forloop处理 php 行值和分组 PHP MYSQL WHILE & For 循环
【发布时间】:2014-06-25 07:16:01
【问题描述】:

从我之前的问题Handling while loop and grouping MYSQL PHP Values - 我又来了,有一些问题 这是我的问题解释如下。

表格

author_id   author_name   author_book     rating  

1           A1          ABC             5
1           A1          DEF             6
2           A2          PPP             8
3           A3          FFF             9

输出

    author_id  author_name  author_book     rating  
        1           A1      ABC             5
                    A1      DEF             6

        2           A2      PPP             8

        3           A3      FFF             9

预期输出

    Author ID       Author Name        Author Book         Rating
        1              A1               ABC                 5
                                        DEF                 6

        2              A2               PPP                 8

        3              A3               FFF                 9     

代码

    <?php

    $link = new mysqli('localhost', 'test', 'test', 'test');
    $query = mysqli_query($link, 'SELECT * FROM author_master ORDER BY author_id');
    $books = array();
    while($row = $query->fetch_assoc()) {
        $books[$row['author_id']][] = $row;
    }
    ?>

    <table border="0" cellpadding="10">
        <thead>
            <tr>
                <th>Author ID</th>
                <th>Author Book</th>
                <th>Rating</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach($books as $author_id => $values): ?>
                <tr>
                    <td><?php echo $author_id; ?></td>
                    <td><?php foreach($values as $author_book) {echo $author_book['author_name'] . '<br/>';} ?></td>
                    <td><?php foreach($values as $author_book) {echo $author_book['author_book'] . '<br/>';} ?></td>
                    <td><?php foreach($values as $author_book) {echo $author_book['rating'] . '<br/>';} ?></td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>

我知道问题出在我循环的第二个问题上。但是如何解决它。

另外,我在我的 php 代码中使用了许多 foreach。有没有这个可以优化的。

再次感谢,

编辑:

我最关心的是如何优化代码而不是使用许多 foreach 来获取值。 另外,不要坚持让我使用mysqli或pdo,因为这是我的客户要求,他只想拼命地使用mysql

金兹

【问题讨论】:

  • 我建议将您从数据库中获得的值放入对象中。如果您愿意,我可以在答案中更详细地解释。作者 id 和姓名也总是相同的吗?
  • 我不确定,但如果值相同,您可以尝试为第一个&lt;td&gt; 添加rowspan=&lt;no-of-loops&gt;,并跳过同一列中的其他&lt;td&gt;。对不起我的懒惰回答。有空我一定会尝试写代码。
  • @kpp - 请。我非常需要你的帮助。
  • 可能简化您的选择查询会降低复杂性,您可以对 author_id 上的数据进行分组。
  • @kpp 该查询不会返回一个对象吗?

标签: php html arrays for-loop while-loop


【解决方案1】:

为了有一种简单快捷的方法来解决双打,可以使用类结构。在其中您为 Authors 和 Books 开设了一个课程,Authours 可以拥有多本书,如果您希望可以更深一层,书籍可以有多个评级或使 id 具有多个这样的作者,但这不是我的示例.如果需要,请告诉我,我可以轻松更改它。

<?php
class Author{
    public $id;
    public $name;
    public $books = array();

    public function __construct($id, $name){
        $this->id = $id;
        $this->name = $name;
    }

    public function addBook($book, $rating){
        $newBook = new Book($book, $rating);
        if(!in_array($newbook, $books){
            array_push($books, $newBook);
        }
    }
}

class Book{
    public $book;
    public $rating;

    public function __construct($book, $rating){
        $this->book = $book;
        $this->rating = $rating;   
    }
    //to make it easy checking for duplicates.
    public function __tostring(){
        return $this->book.$this->rating;
}

//yourcode
$books = array;
$newBook = null;
while($row = $query->fetch_assoc()){
   if($newBook->id != $row['author_id'];){
       $newBook = new Author($row['author_id'], $row['author_name']);
       array_push($books, $newBook);
   }
   $newBook->addBook($row['author_book'], $row['rating']);
}?>

//and then your foreach.
<?php foreach($books as $author): ?>
    <tr>
        <td><?php echo $author->id; ?></td>
        <td><?php echo $author->name; ?></td>
        <td><?php foreach($author->books as $book) {echo $book->book.'<br/>';}?></td>
        <td><?php foreach($author->books as $book) {echo $book->rating.'<br/>';}?></td>
    </tr>
<?php endforeach; ?>

这是一种 OOPHP 方法,在这种情况下非常有效,因为如果需要,它可以很容易地进行修改。

【讨论】:

    【解决方案2】:

    我只是对您的代码进行了一些更改。不知道是不是你想要的。这是代码。

    <?php
    $link = mysqli_connect("localhost", 'test', 'test', "test");
    $query = mysqli_query($link, 'SELECT * FROM author_master ORDER BY author_id');
    $books = array();
    while ($row = $query->fetch_assoc()) {
        $books[$row['author_id']][$row['author_name']][] = $row;
    }
    mysqli_close($link);
    ?>
    
    <table border="0" cellpadding="10">
        <thead>
            <tr>
                <th>Author ID</th>
                <th>Author Book</th>
                <th>Rating</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($books as $author_id => $values): ?>
                <tr>
                    <td><?php echo $author_id; ?></td>
                    <td>
                        <?php
                        foreach ($values as $ankey => $author_book) {
                            echo $ankey . '<br/>';
                        }
                        ?></td>
                    <td>
                        <?php
                        foreach ($values as $author_book) {
                            foreach ($author_book as $br) {
                                echo $br['author_book'] . '<br/>';
                            }
                        }
                        ?>
                    </td>
                    <td>
                        <?php
                        foreach ($values as $author_book) {
                            foreach ($author_book as $br) {
                                echo $br['rating'] . '<br/>';
                            }
                        }
                        ?>
                    </td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2017-05-15
      相关资源
      最近更新 更多