Отображение многомерного массива PHP в HTML-таблице с каждым подмассивом в столбце - PullRequest
0 голосов
/ 03 марта 2011

Я уверен, что есть довольно простой способ сделать это.У меня есть следующие данные в массиве:

Array
(
    [ActivityDiaryEntry] => Array
        (
            [date] => 2011-03-03
            [type] => Walking
            [minutes] => 60
        )

)
Array
(
    [ActivityDiaryEntry] => Array
        (
            [date] => 2011-03-02
            [type] => Walking
            [minutes] => 22
        )

)
Array
(
    [ActivityDiaryEntry] => Array
        (
            [date] => 2011-03-01
            [type] => Biking
            [minutes] => 45
        )

)

Я не слишком разбираюсь в PHP, но я знаю, как отображать эти данные по строкам, чтобы отображать как <tr><td>[date]</td><td>[type]</td><td>[minutes]</td></tr>.Но я бы хотел, чтобы данные отображались в таких столбцах:

2011-03-01 | 2011-03-02 | 2011-03-03
------------------------------------
Biking     | Walking    | Walking
------------------------------------
45         | 22         | 60

Ответы [ 6 ]

2 голосов
/ 03 марта 2011

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

<?php
// Your list of records
$records = array(
    array( "key1" => "value", "key2" => "value", "key3" => "value" ),
    array( "key1" => "value", "key2" => "value", "key3" => "value" ),
    array( "key1" => "value", "key2" => "value", "key3" => "value" )
);

// Create an array to store the values of each row based on number of columns in first value
$rows = array_fill( 0, count( $records[0] ), "" );
$keys = array_keys( $records[0] );

// Create a column for each record in it's respective row.
foreach( $records as $k => $record )
    for( $i=0, $max=count( $rows ); $i < $max; $i++ )
        $rows[ $i ] .= "<td>".$record[ $keys[ $i ] ]."</td>";

// Turn each row in our array into an html table row.
print "<tr>".implode( "</tr><tr>", $rows )."</tr>";

Вот тест кода: http://codepad.org/SSS8S2eU

1 голос
/ 04 марта 2011

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

$data = array (
array (
   'ActivityDiaryEntry' => array
        (
            'date' => "2011-03-03",
            'type' => "Walking",
            'minutes' => 60
        )
    ),
    array (
    'ActivityDiaryEntry' => array
        (
            'date' => "2011-03-02",
            'type' => Walking,
            'minutes' => 22
        ) ),
array (
    'ActivityDiaryEntry' => array
        (
            'date' => "2011-03-01",
            'type' => Biking,
            'minutes' => 45
        )
        )
);    

echo "<table>";
$i = 0;

foreach ($data as $key => $val) {
echo "<tr>";
    foreach ($data as $kk => $vv){


    if ($i==0) {
        echo "<td>". $vv['ActivityDiaryEntry']['date'] ."</td>";    
    }else if ($i == 1){
        echo "<td>". $vv['ActivityDiaryEntry']['type'] ."</td>";    
    }else if ($i == 2){
        echo "<td>". $vv['ActivityDiaryEntry']['minutes'] ."</td>"; 
    }


    }

echo "</tr>";
$i++;
}

echo "</table>";
1 голос
/ 04 марта 2011

Немного некрасиво, но работает: ')

$a[0] = array('ActivityDiaryEntry' => array("date" => "2011-03-03", "type"=> "Walking", "minutes" => 60));
$a[1] = array('ActivityDiaryEntry' => array("date" => "2011-03-03", "type"=> "Walking", "minutes" => 22));
$a[2] = array('ActivityDiaryEntry' => array("date" => "2011-03-03", "type"=> "Biking", "minutes" => 42));

$keys = array_keys($a[0]["ActivityDiaryEntry"]);

echo '<table>';
for($c = 0; $c < count($a); $c++) {
    echo '<tr>';
        for($i = 0; $i < count($a[$c]['ActivityDiaryEntry']); $i++) {
            echo '<td>' . $a[$i]['ActivityDiaryEntry'][$keys[$c]] . '</td>';
        }
    echo '</tr>';       
}
echo '</table>';

http://codepad.org/5Tuk8x3Q

0 голосов
/ 03 марта 2011

Ответ на Javascript ниже может быть хорошим способом сделать это, но я бы посоветовал использовать PHP и таблицы, если вам не совсем удобно использовать Javascript в ваших приложениях. Это также хорошая практика PHP.

На вашем месте я бы использовал такой код и свойства css для форматирования таблицы так, как вам хотелось бы.

  echo '<table>';
  echo '<tr><td>Date</td><td>Type</td><td>Minutes</td></tr>';

  foreach ($array as $entry){
      echo '<tr>';
      echo '<td>'.$entry['date'].'</td>';
      echo '<td>'.$entry['type'].'</td>';
      echo '<td>'.$entry['minutes'].'</td>';
      echo '</tr>';
  }

  echo '</table>';

Вы можете использовать подобные вещи для редактирования отображения таблиц, также посмотрите http://www.w3schools.com/css/css_table.asp

echo '<tr style="border-bottom: 1px solid black;"></tr>';

ура

0 голосов
/ 03 марта 2011

Это было бы отличным кандидатом на DataTables , который на самом деле является Javascript, который я использую для отображения моих результатов, сгенерированных на серверной части PHP.Это полноценная система сетки Javascript, которая добавляет массу функций к стандартным выводам таблиц HTML.Чтобы это работало, вы должны:

  1. Получить результаты, как показано, и вывести их в виде строки json_encoded (т. Е. Echo json_encode ($ array). Я делаю это в отдельном файле, поэтому он выводит чистый текст вscreen.
  2. На странице для отображения таблицы настройте «фиктивную таблицу»
  3. Настроить таблицы данных на той же странице, что и фиктивная таблица, следующим образом:

    $(document).ready(function() {
        $('#replace').dataTable( {
            "bProcessing": true,
            "sAjaxSource": 'file.php'
        } );
    } );
    
  4. Установите значения для сортировки, фильтрации, подкачки страниц и т. Д. В учебнике.

Datatables дает вам гораздо больше возможностей, чем обычная таблица HTML,и вы уже на 90% справляетесь с данными. Это намного удобнее для пользователя, чем просто глушение на экране.

0 голосов
/ 03 марта 2011

Вы можете написать цикл for для каждого поля, отображая по одной строке в каждом цикле.

...