2016-02-18 3 views
1

У меня есть набор данных, возвращаемый из базы данных, а ключи - это имена полей, которые мне нужно распечатать на таблице.PHP Получить ключи от первого массива

Например, если у меня есть массив из 5 ключей (полей), мне нужно создать таблицу HTML, в которой есть заголовок с каждым из ключей на нем. Затем мне нужно было распечатать результаты в таблице.

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

Вот мои данные:

SimpleXMLElement Object 
(
    [data] => SimpleXMLElement Object 
     (
      [primaryFields] => SimpleXMLElement Object 
       (
        [primary] => Array 
         (
          [0] => SimpleXMLElement Object 
           (
            [Project_Title] => Test 
            [Project_Description_Preview] => Test Desc 
           ) 

          [1] => SimpleXMLElement Object 
           (
            [Project_Title] => Blueprint Development Project 
            [Project_Description_Preview] => We are continuing to improve Blueprint as a tool by collecting feedback from our internal users and developing new features. 
           ) 

Что бы быть лучшим способом идти о получении keys от первого результата в массиве? Если это две отдельные петли; сначала один цикл для создания заголовков из ключей, а затем второй печатает данные?

Project_Title & Project_Description_Preview В этом случае будут заголовки таблиц.

+1

Будет ли 'foreach ($ array as $ key => $ value)' не делать то, что вам нужно? – Yumecosmos

ответ

1

Я оставлю это вам, чтобы проанализировать данные, которые вы возвращаете. От внешнего вида объекта добираются до первичного.

<?php 
//You will need to parse the object to get this. 
$primary = array(
    array(
     "Project_Title" => "Test", 
     "Project_Description_Preview" => "Test Desc" 
    ), 
    array(
     "Project_Title" => "Blueprint Development Project", 
     "Project_Description_Preview" => "We are continuing to improve Blueprint as a tool by collecting feedback from our internal users and developing new features." 
    ) 
); 

echo "<table>"; 
for($i = 0; $i < count($primary); $i++){ 
//Only create the head on your first object 
if($i==0){ 
    echo "<thead>"; 
    //build header here 
    echo "<tr>"; 
    foreach($primary[$i] as $key => $value){ 
     echo "<th>" . $key . "</th>"; 
    } 
    echo "</tr>"; 
    echo "</thead><tbody>"; 
} 
//Then create the rows and data like all php... 
echo "<tr>"; 

foreach($primary[$i] as $value){ 
    echo "<td>" . $value . "</td>"; 
} 
echo "</tr>"; 

} 
echo "</tbody></table>"; 

?> 
+0

Я думаю, что проблема, с которой он сталкивается, заключается в том, что '$ primary' не является массивом массивов, это массив объектов. – jhaagsma

+0

@jhaagsma, основанный на заголовке о получении ключа от массива, чтобы сделать заголовки на первом проходе. – nerdlyist

0

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

Looping как так (в качестве бонуса позволяет извлечь ключи на всякий случай):

$primary = $obj->data->primaryFields->primary; //an array 
$first = true; 
$keys = array(); 
foreach ($primary as $obj) { 
    if ($first) { 
    $first = false; 
    $keys = get_array_keys((array)$obj)); 
    make_headers($obj,$keys); //do header things here 
    } 
    make_table_stuff($obj,$keys); //do table stuff 
} 

Но, вы всегда можете сделать:

$keys = get_object_vars($obj->data->primaryFields->primary[0]); 
+0

Хм, я думаю, я не уверен, как создать заголовки/результаты в пределах одного цикла. – SBB

+0

Я добавил пример цикла, который также извлекает ключи по типу, набрасывая obj как массив. Хотя я только что вспомнил, что вы действительно можете перебирать свойства объектов, чтобы это было необязательно. – jhaagsma

0

вы должны просматривать массив из определенного место, скажем

$arr->data->primaryFields->primary как $primary.

с учетом массива от primary.

foreach($primary as $values){ 
    foreach($values as $key => $ value){ 
     echo $key." & ".$value; 
    } 
} 
0

Примечание: это будет работать для любого количества столбцов базы данных, независимо от того, известны они или нет.

Вы должны быть в состоянии построить всю таблицу, как это:

//where $obj = your output... 

//get the column names, convert to an object and store inside an array of one element 
$keys = array(json_decode(json_encode(array_keys(get_object_vars($obj[0]))))); 

//create the output array by merging the keys as the first element with the existing dataset into a new array 
$output = array_merge($keys, $obj); 

//here is the output step 
echo "<table><thead>"; 
foreach($output as $record_num => $record) { 
    echo '<tr>'; 
    $cells = get_object_vars($record); 
    foreach ($cells as $column => $cell) { 
     echo '<td class="' . $column . '">' . $cell . '</td>'; 
    } 
    echo '</tr>'; 

    //if this is the first element of the array, it is the column names. After these are output, the rest should be in the tbody tag 
    if ($record_num == 0) { echo '</thead><tbody>';} 
} 
echo "</tbody></table>"; 

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