Таблица в PHP показывает повторяющиеся столбцы из массива - PullRequest
0 голосов
/ 08 июня 2018

Я написал код для записи таблицы из переменной массива, но он показывает повторяющиеся столбцы:

image

Вот значения массива:

    $data = [
    [
        "title" => "The World's End",
        "genre" => "Sci-fi",
        "year"  => 2013,
        "gross" => 21
    ],
    [
        "title" => "Scott Pilgrim vs. the World",
        "genre" => "Sadness",
        "year"  => 2010,
        "gross" => 21
    ],
    [
        "title" => "Hot Fuzz",
        "genre" => "Buddy Cop",
        "year"  => 2007,
        "gross" => 21
    ],
    [
        "title" => "Shaun of the Dead",
        "genre" => "Zombie",
        "year"  => 2007,
        "gross" => 21
    ],
];

И таблицанаписание кода:

    <table>
    <tr>
        <?php
        foreach ($data as $item){
            foreach ($item as $key => $drop){
                echo '<th>' . $key . '</th>';
            }
        }
        ?>
    </tr>
    <?php foreach ($data as $item) : ?>
    <tr>
        <td><?= $item['title']; ?></td>
        <td><?= $item['genre']; ?></td>
        <td><?= $item['year']; ?></td>
        <td>€ <?= $item['gross']; ?></td>
        <?php endforeach; ?>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>€
            <?php
            $gross_sum = 0;
            foreach ($data as $gross_value)
            {
                $gross_sum += $gross_value['gross'];
            }
            echo $gross_sum;
            ?>
        </td>
    </tr>
</table>

Как удалить повторяющуюся правую часть столбца в таблице из содержимого моего кода?

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Я воспользовался этим, чтобы написать это так, как хотел бы.Надеюсь, это поможет вам.

<?php
$data = [
    [
        "title" => "The World's End",
        "genre" => "Sci-fi",
        "year"  => 2013,
        "gross" => 21,
    ],
    [
        "title" => "Scott Pilgrim vs. the World",
        "genre" => "Sadness",
        "year"  => 2010,
        "gross" => 21,
    ],
    [
        "title" => "Hot Fuzz",
        "genre" => "Buddy Cop",
        "year"  => 2007,
        "gross" => 21,
    ],
    [
        "title" => "Shaun of the Dead",
        "genre" => "Zombie",
        "year"  => 2007,
        "gross" => 21,
    ],
];

// Let's grab your headers
$headers = array_keys($data[0]);

// Format them by capitalizing the first letter
$headers = array_map('ucfirst', $headers);

/**
 * You could also inline it into one assignment
 * This decreases readability, but removes the quick reassignment of $header
 *
 * $headers = array_map('ucfirst', array_keys($data[0]));
 */

/**
 * Let's calculate the gross here instead of in the presentation (HTML)
 */
$total_gross = array_reduce($data, function ($gross, $movie) {
    $gross += $movie['gross'];

    return $gross;
}, 0);
?>

<table>
    <tr>
        <?php foreach ($headers as $header) :
            printf('<th>%s</th>', $header);
        endforeach; ?>
    </tr>
    <?php foreach ($data as $movie) : ?>
        <tr>
            <?php
            printf('<td>%s</td>', $movie['title']);
            printf('<td>%s</td>', $movie['genre']);
            printf('<td>%s</td>', $movie['year']);
            printf('<td>€ %s</td>', $movie['gross']);
            ?>
        </tr>
    <?php endforeach; ?>
    <tr>
        <td colspan="3"></td>
        <?php printf('<td>€ %s</td>', $total_gross); ?>
    </tr>
</table>
0 голосов
/ 08 июня 2018

Вы можете использовать current для получения первого элемента массива и array_keys для получения ключей.Объединение этого внутри foreach должно решить вашу проблему.

foreach (array_keys(current($data)) as $key) {
    echo "<th>$key</th>";
}

В дополнение к этому, часто это лучший способ определить заголовок статически (за исключением того, что вы не знаете содержимое таблицы),

$header = ['title', 'genre', 'year', 'gross'];
foreach ($header as $text) {
   echo "<th>$text</th>";
}
0 голосов
/ 08 июня 2018

Это потому, что в начале у вас есть вложенный цикл foreach, поэтому вы будете перебирать каждую запись в $data, а затем снова перебирать ключ.Для ваших заголовков вам нужно всего лишь один раз перебрать ключи.Посмотрите на код ниже, я внес небольшое изменение в ваш первый цикл foreach.

<?php

$data = [
    [
        "title" => "The World's End",
        "genre" => "Sci-fi",
        "year"  => 2013,
        "gross" => 21
    ],
    [
        "title" => "Scott Pilgrim vs. the World",
        "genre" => "Sadness",
        "year"  => 2010,
        "gross" => 21
    ],
    [
        "title" => "Hot Fuzz",
        "genre" => "Buddy Cop",
        "year"  => 2007,
        "gross" => 21
    ],
    [
        "title" => "Shaun of the Dead",
        "genre" => "Zombie",
        "year"  => 2007,
        "gross" => 21
    ],
];
?>

<html>
    <table>
    <tr>
        <?php
        foreach ($data[0] as $key => $item){
            // foreach ($item as $key => $drop){
                echo '<th>' . $key . '</th>';
            // }
        }
        ?>
    </tr>
    <?php foreach ($data as $item) : ?>
    <tr>
        <td><?= $item['title']; ?></td>
        <td><?= $item['genre']; ?></td>
        <td><?= $item['year']; ?></td>
        <td>€ <?= $item['gross']; ?></td>
        <?php endforeach; ?>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>€
            <?php
            $gross_sum = 0;
            foreach ($data as $gross_value)
            {
                $gross_sum += $gross_value['gross'];
            }
            echo $gross_sum;
            ?>
        </td>
    </tr>
</table>
</html
0 голосов
/ 08 июня 2018

Попробуйте заменить

<tr>
    <?php
    foreach ($data as $item) {
        foreach ($item as $key => $drop) {
            echo '<th>' . $key . '</th>';
        }
    }
    ?>
</tr>

на это:

<tr>
    <?php
    foreach (array_keys($data[0]) as $item) {
        echo '<th>' . $item . '</th>';
    }
    ?>
</tr>

Там есть функция array_keys возврат ключей для отображения в заголовке.

...