Форматирование массива php в древовидную структуру - PullRequest
1 голос
/ 01 ноября 2019

У меня есть следующий массив:

$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
    ]
];

Так что, если я запускаю цикл 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;

Это дает мне следующий вывод:

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

Но я хочу вывод в этом формате.

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

Я не мог понять, как это сделать внутри цикла foreach. Что я попробовал:

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

Как видно из кода моей попытки, я пропускаю по одной строке для каждого цикла основной категории. Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Я думаю, что вам не нужно else, и добавляйте часть colspan только тогда, когда $prevMain и $currentMain различаются.

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

См. php demo

Примечание , которое я переименовал $prevmain в $prevMain

После форматирования структуры строки таблицы вывод будет выглядеть так:

<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>
0 голосов
/ 01 ноября 2019

Это многомерный массив. Вы можете использовать ключ в цикле foreach:

foreach($array as $key => $row) {
   echo $row['categoryName']; ....
}
0 голосов
/ 01 ноября 2019

Обновите ваш 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...