У меня есть массив, который я генерирую из URL-адреса.
$url = 'https://www.datastro.eu/api/explore/v2.1/catalog/datasets/orbits-for-current-comets-in-the-mpc-database/records?order_by=h%20ASC' ;
$data = file_get_contents($url);
$comets = json_decode($data, true);
if ($comets === null) {
die("Error decoding JSON data.");
}
//echo '<pre>'; print_r($comets); echo '</pre>';
Я заполнил таблицу:
<table class = "table table-dark table-striped display" id = "myTable">
<thead>
<tr>
<th scope = "col">designation_and_name</th>
<th scope = "col">orbit_type</th>
...
</tr>
</thead>
<tbody>
<?php for ($i=0; $i<=$comete['total_count']; $i++) { ?>
<tr>
<th scope = "row"><?php echo($comete['results'][$i]['designation_and_name']); ?></th>
<td><?php echo($comete['results'][$i]['orbit_type']); ?></td>
...
</tr>
<?php } ?>
</tbody>
</table>
Пока все хорошо, но когда я вставляю скрипт DataTable, таблица становится пустой.
<script>
new DataTable('#myTable');
</script>
Пожалуйста, помогите мне! Я хочу применить табуляцию к таблицам, которыми в противном случае было бы невозможно управлять.
Попробуйте следующее: [PHP code goes here] <table class = "table table-dark table-striped display" id = "myTable"> <!-- Table header goes here --> <tbody> <?php for ($i = 0; $i < count($comets['results']); $i++) { ?> <tr> <th scope = "row"><?php echo $comets['results'][$i]['designation_and_name']; ?></th> <td><?php echo $comets['results'][$i]['orbit_type']; ?></td> </tr> <?php } ?> </tbody> </table> <script> $(document).ready(function() { $('#myTable').DataTable(); }); </script>
Спасибо за ответ. На самом деле названия массивов не совпадали, но в моем коде они были правильными. Я просто неправильно написал в вопросе. Если я использую этот URL: datastro.eu/api/explore/v2.1/catalog/datasets/… с где, таблица данных о порядке и ограничении в порядке, но если я удалю ?where=h%3C%3D6&order_by=h %20ASC&limit=100 таблица пуста.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


API возвращает только 10 записей из общего числа, и поскольку вы используете цикл for на основе значения total_count, когда индекс ссылается на строку вне диапазона, возвращается нулевое значение (генерируя подавленное предупреждение PHP), и соответствующее эхо создает пустое значение, поэтому в вашей таблице есть несколько пустых строк. Поскольку dataTables по умолчанию сортируется по возрастанию первой строки, вы получаете все пустые строки вверху: таблица не очищается, вы видите первые пустые строки.
Вот некоторые изменения кода, чтобы убедиться в этом:
<?php
$url = 'https://www.datastro.eu/api/explore/v2.1/catalog/datasets/orbits-for-current-comets-in-the-mpc-database/records?order_by=h%20ASC' ;
$data = file_get_contents($url);
$comets = json_decode($data, true);
if ($comets === null) {
die("Error decoding JSON data.");
}
//--- Prints the total rows counter and the total rows really received
echo '<br>', 'Total rows:', $comets['total_count'], '<br>', 'Total received:', count($comets['results']), '<br><br>';
?>
<!DOCTYPE html>
<html>
<head>
<link href = "https://cdn.datatables.net/2.0.3/css/dataTables.dataTables.css" rel = "stylesheet">
</head>
<body>
<table class = "table table-dark table-striped display" id = "myTable">
<thead>
<tr>
<th scope = "col">designation_and_name</th>
<th scope = "col">orbit_type</th>
<th scope = "col">node</th>
<th scope = "col">e</th>
<th scope = "col">h</th>
<th scope = "col">g</th>
</tr>
</thead>
<tbody>
<!-- Using foreach we traverse the real rows received (here in the alternative syntax for greater readability) -->
<?php foreach ($comets['results'] as $row):?>
<tr>
<!-- php echo in shorthand format -->
<th scope = "row"><?= $row['designation_and_name'] ?></th>
<td><?= $row['orbit_type'] ?></td>
<td><?= $row['node'] ?></td>
<td><?= $row['e'] ?></td>
<td><?= $row['h'] ?></td>
<td><?= $row['g'] ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src = "https://cdn.datatables.net/2.0.3/js/dataTables.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', () => {
let dt = new DataTable('#myTable');
// prints in the browser's console the default order set by DataTables
console.info (dt.order());
});
</script>
</body>
</html>
Я предполагаю, что API нужна авторизация для получения всех строк (проверьте здесь)
Читая документацию, я вижу, что вы можете использовать эту конечную точку для получения полных данных, формат немного другой, поэтому вы можете применить эти изменения к коду:
$url = 'https://www.datastro.eu/api/explore/v2.1/catalog/datasets/orbits-for-current-comets-in-the-mpc-database/exports/json';
удалить распечатку общей записи
foreach() становится:
<?php foreach ($comets as $row): ?>
Спасибо! В нем все правильно. API возвращает только 10 записей, если я не указываю ограничение в запросе и по факту они были в конце таблицы. Я считаю, что услуга по получению их всех платная. Однако я заметил, что если я введу в запрос ограничение 100, он вернет 100 записей + все остальные пустые строки, если я введу более 100, это выдаст мне ошибку чтения файла json. Я попробую использовать foreach, чтобы не отображать пустые строки. Вы были поучительны, спасибо!
Я отредактировал ответ, добавив дополнительную информацию
Благодаря этим вашим последним изменениям теперь у меня есть все записи в таблице с данными. Вы были бесценны, спасибо. К сожалению тем, кто не знает английского как я, всегда сложно читать документацию, я сразу падаю духом.
Кажется, существует несоответствие в именах переменных между PHP и JavaScript. Обязательно используйте одно и то же имя переменной при декодировании данных JSON в PHP и инициализации DataTable в JavaScript.