简体   繁体   English

将 php 数组格式化为树状结构

[英]Formatting php array to a tree like structure

I have the following array:我有以下数组:

$array = [
    1 => [
        'categoryName'=>'Main One',
        'title'=>'Title one',
        'date'=>'2019-09-01',
        'score'=>2500
    ],
    2 => [
        'categoryName'=>'Main One',
        'title'=>'Title two',
        'date'=>'2019-09-02',
        'score'=>3000
    ],
    3 => [
        'categoryName'=>'Main Two',
        'title'=>'Other title',
        'date'=>'2019-09-02',
        'score'=>2100
    ],
    4 => [
        'categoryName'=>'Main Three',
        'title'=>'Other title',
        'date'=>'2019-09-05',
        'score'=>200
    ],
    5 => [
        'categoryName'=>'Main Three',
        'title'=>'Other topic',
        'date'=>'2019-09-02',
        'score'=>1000
    ]
];

So if I run a foreach loop on it:因此,如果我在其上运行 foreach 循环:

$html = '';
$html = '<table>';
foreach($array as $row){
    $html .= '<tr>';
    $html .= '<td>'.$row['categoryName'].'</td>';
    $html .= '<td>'.$row['title'].'</td>';
    $html .= '<td>'.$row['date'].'</td>';
    $html .= '<td>'.$row['score'].'</td>';
    $html .= '<tr>';
}
$html .='</table>';
echo $html;

This gives me the following output:这给了我以下 output:

 <table border=1> <tbody> <tr> <td>Main One</td> <td>Title one</td> <td>2019-09-01</td> <td>2500</td> </tr> <tr> <td>Main One</td> <td>Title two</td> <td>2019-09-02</td> <td>3000</td> </tr> <tr> <td>Main Two</td> <td>Other title</td> <td>2019-09-02</td> <td>2100</td> </tr> <tr> <td>Main Three</td> <td>Other title</td> <td>2019-09-05</td> <td>200</td> </tr> <tr> <td>Main Three</td> <td>Other topic</td> <td>2019-09-02</td> <td>1000</td> </tr> </tbody> </table>

But I want the output in this format.但我想要这种格式的 output。

 <table border=1> <tbody> <tr> <td colspan="2">Main One</td> </tr> <tr> <td>2019-09-01</td> <td>Title One</td> <td>2500</td> </tr> <tr> <td>2019-09-02</td> <td>Title Two</td> <td>3000</td> </tr> <tr> <td colspan="2">Main Two</td> </tr> <tr> <td>2019-09-02</td> <td>Other title</td> <td>2100</td> </tr> <tr> <td colspan="2">Main Three</td> </tr> <tr> <td>2019-09-05</td> <td>Other Title</td> <td>200</td> </tr> <tr> <td>2019-09-02</td> <td>Other topic</td> <td>1000</td> </tr> </tbody> </table>

I could not get my head around on how to do it inside the foreach loop.我无法理解如何在 foreach 循环中执行此操作。 What I did try:我所做的尝试:

 $prevmain = "";
 foreach($array as $row):
    $currentMain = $row['categoryName'];
    if($currentMain!=$prevMain){
       $html .='<tr>
                <td colspan="2">'.$row['currentMain'].'</td>
                <td></td>
               </tr>';
    } else{
       //Here I miss data for the first loop
       $html .='<tr>
                <td>'.$row['date].'</td>
                <td>'.$row['title'].'</td>
                <td>'.$row['score].'</td>
               </tr>';
     }
    $prevmain = $row['categoryName'];        
 endforeach;

As you can see from my attempt code, I miss one row for each loop of the main category.从我的尝试代码中可以看出,我错过了主类别的每个循环的一行。 Can anyone help me?谁能帮我?

I think you don't need the else and only add the colspan part when the $prevMain and $currentMain are different.我认为您不需要 else 并且仅在$prevMain$currentMain不同时添加 colspan 部分。

$prevMain = "";
$currentMain = "";
$html = "";
foreach($array as $row):
    $currentMain = $row["categoryName"];
    if($currentMain !== $prevMain) {
        $prevMain = $row["categoryName"];
        $html .= '<tr>' .
            '<td colspan="2">' . $row['categoryName'] . '</td>' .
            '<td></td>' .
            '</tr>';
    }
    $html .='<tr>'.
            '<td>'.$row['date'] .'</td>'.
            '<td>'.$row['title'].'</td>'.
            '<td>'.$row['score'] . '</td>'.
           '</tr>';
endforeach;

echo $html;

See a php demo查看php 演示

Note that I have renamed $prevmain to $prevMain请注意,我已将$prevmain重命名为$prevMain

After formatting the table row structure output will look like:格式化表格行结构 output 后将如下所示:

<tr>
    <td colspan="2">Main One</td>
    <td></td>
</tr>
<tr>
    <td>2019-09-01</td>
    <td>Title one</td>
    <td>2500</td>
</tr>
<tr>
    <td>2019-09-02</td>
    <td>Title two</td>
    <td>3000</td>
</tr>
<tr>
    <td colspan="2">Main Two</td>
    <td></td>
</tr>
<tr>
    <td>2019-09-02</td>
    <td>Other title</td>
    <td>2100</td>
</tr>
<tr>
    <td colspan="2">Main Three</td>
    <td></td>
</tr>
<tr>
    <td>2019-09-05</td>
    <td>Other title</td>
    <td>200</td>
</tr>
<tr>
    <td>2019-09-02</td>
    <td>Other topic</td>
    <td>1000</td>
</tr>

Update your foreach with this:用这个更新你的foreach:

$html = '';
$html = '<table>';
foreach($array as $row){
    $html .= '<tr>';
    $html .= '<td colspan="2">'.$row["currentMain"].'</td>';
    $html .= '<td></td>';
    $html .= '</tr>'
    $html .= '<tr>';
    $html .= '<td>'.$row['categoryName'].'</td>';
    $html .= '<td>'.$row['title'].'</td>';
    $html .= '<td>'.$row['date'].'</td>';
    $html .= '<td>'.$row['score'].'</td>';
    $html .= '</tr>';
}
$html .='</table>';
echo $html;

This is a multidimensional array.这是一个多维数组。 You can use key in your foreach loop:您可以在 foreach 循环中使用 key:

foreach($array as $key => $row) {
   echo $row['categoryName']; ....
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM