У меня есть конкретный файл JSON, который выглядит так:
[
{
"objID":"kc6BvvNlVW",
"string":"bill",
"createdOn":"2018-09-18T01:51:02",
"updatedOn":"2018-09-18T01:51:02",
"number":1,
"boolean":true,
"array":["item1","item2"],
"pointer":{"type":"__pointer","objID":"hYtr54Ds","className":"Users"}
},
{
"objID":"sS1IwFPPWh",
"string":"tom",
"createdOn":"2018-09-18T01:59:40",
"updatedOn":"2018-09-18T01:59:40",
"number":12.3,
"boolean":false,
"array":["item1","item2"],
"pointer":{"type":"__pointer","objID":"tRe4Fda5","className":"Users"}
}
]
1. Мне нужно сначала проверить, есть ли у объекта "указатель""__pointer" внутри ключа type, и показать только значение objID в таблице HTML, например:
"tRe4Fda5"
Прямо сейчас моя таблица выглядит так:
А вот мой PHP-код foreach (в строке таблицы):
foreach($jsonObjs as $i=>$obj) {
$row_id = $i;
echo '<tr>';
foreach($obj as $key => $value){
// $value is an Array:
if (is_array($value)) {
echo '<td>';
foreach($value as $k=>$v){
// $v is a Pointer
if ($v === '__pointer') {
echo json_encode($v); // <-- WHAT SHOULD I DO HERE ?
// $v is an Array:
} else {
echo json_encode($v);
}
}
echo '</td>';
// $value is a Number:
} else if (is_numeric($value)){
echo '<td>'.(float)$value.'</td>';
// $value is a String:
} else { echo '<td>'.$value.'</td>'; }
}
Как вы можете видеть в столбце указатель, я получаю следующую строку:
"__pointer""hYtr54Ds""Users"
без запятых в качестве разделителей, поэтому мне нужно отредактировать эту строку кода:
echo json_encode($v); // <-- WHAT SHOULD I DO HERE ?
Я пробовал с echo json_encode($v[$k]['__ponter']);, но без положительных результатов.
Итак, мой последний первый вопрос: как я могу получить каждое ЗНАЧЕНИЕ массива "указатель"?
2. Кроме того, вторая строка логического столбца показывает примечание, поскольку его значение - false, не должно ли оно показывать 0, поскольку первая строка показывает 1 (true)?






вместо того
foreach($value as $k=>$v){
// $v is a Pointer
использовать
foreach($value as $k)
{
//then check for pointer
if ($k->type === '__pointer')
{
echo json_decode($k); //here you will get proper key and value
}
}
извините, нет положительного результата, я получаю пустые данные, он ничего не распечатывает, как показано здесь: i.postimg.cc/DwbTrZRb/json2.png
выше - ответ на ваш первый вопрос. просто напечатайте json_decode ($ k) n проверьте, получили ли вы ключ со значением
Я знаю, но опять же, с моей стороны это не работает, вот что я сделал: foreach ($ obj as $ key => $ value) {if (is_array ($ value)) {echo '<td>' ; foreach ($ значение как $ k) {if ($ k-> type === '__pointer') {echo json_decode ($ k); // здесь вы получите правильный ключ и значение}}
после этого if ($ k-> type === '__pointer') {print_r (json_decode ($ k)); выход; // здесь проверяем получение значения с ключом или нет
и во-вторых, как вы хотите сохранить это в своей базе данных
Я не использую базу данных, а только файлы JSON :) Я создаю новый бэкэнд, используя только файлы JSON, без использования mySQL и Node.js
Вы можете заглянуть в объект во время второго цикла, чтобы увидеть, есть ли у него свойство с именем type и установлено ли это свойство на __pointer.
foreach($jsonObjs as $i=>$obj) {
$row_id = $i;
foreach($obj as $key => $value){
// see if $value has a type property that is set to pointer
if (isset($value['type']) && $value['type'] == "__pointer") {
// $value is the pointer object. Do with it what you will
echo "<td>" . $value['objID'] . "</td>";
}
// more code
}
}
проблема в том, что я должен использовать динамические ключи, поэтому вы устанавливаете $ obj ['указатель'], но имя объекта не всегда является «указателем», оно может отличаться, и поэтому я использовал все эти циклы, я всегда должен получать $ keys на основе объекта JSON
ИМО, имя свойства для структуры, такой как ваш объект-указатель, всегда должно быть «указателем», поэтому вы можете перейти непосредственно к указателю, а не искать вокруг, чтобы увидеть, содержит ли объект что-то, похожее на указатель.
это сработало, большое спасибо! Как насчет моего второго вопроса о логическом значении false, которое не отображается как 0?
PS: хотя теперь в моем столбце «массив» отображается только «Массив», а не «элемент1» «элемент2» ...
Для логического вам нужно что-то вроде этого: else if (is_bool($value)){ echo '<td>'.($value?'1':'0').'</td>';}
Большое спасибо, я хотел бы поболтать с вами для получения дополнительной информации, если вы доступны для найма
Вам по-прежнему нужен исходный код для отображения «нормального» массива, поэтому поместите исходный код после if-clause Джеймса, как этот else if (is_array($value)) {..., и удалите код, который был специально для указателя.
ты прав, я понял это минуту назад, это работает как шарм, большое спасибо! Можно ли в частном порядке связаться с вами по некоторым запросам PHP / JSON, возможно, нанять вас?
@Ven Если да, я только что проверил с помощью эха, он дает TRUE, так как он дает TRUE для другого массива только значений (без ключей)