Фильтровать массив JSON с объектами внутри в PHP

У меня есть конкретный файл 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"

Прямо сейчас моя таблица выглядит так:

Фильтровать массив JSON с объектами внутри в PHP

А вот мой 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)?

@Ven Если да, я только что проверил с помощью эха, он дает TRUE, так как он дает TRUE для другого массива только значений (без ключей)

Frank Eno 18.09.2018 14:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
780
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вместо того

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

Frank Eno 18.09.2018 14:03

выше - ответ на ваш первый вопрос. просто напечатайте json_decode ($ k) n проверьте, получили ли вы ключ со значением

Roshni hegde 18.09.2018 14:06

Я знаю, но опять же, с моей стороны это не работает, вот что я сделал: foreach ($ obj as $ key => $ value) {if (is_array ($ value)) {echo '<td>' ; foreach ($ значение как $ k) {if ($ k-> type === '__pointer') {echo json_decode ($ k); // здесь вы получите правильный ключ и значение}}

Frank Eno 18.09.2018 14:13

после этого if ($ k-> type === '__pointer') {print_r (json_decode ($ k)); выход; // здесь проверяем получение значения с ключом или нет

Roshni hegde 18.09.2018 14:17

и во-вторых, как вы хотите сохранить это в своей базе данных

Roshni hegde 18.09.2018 14:18

Я не использую базу данных, а только файлы JSON :) Я создаю новый бэкэнд, используя только файлы JSON, без использования mySQL и Node.js

Frank Eno 18.09.2018 14:19
Ответ принят как подходящий

Вы можете заглянуть в объект во время второго цикла, чтобы увидеть, есть ли у него свойство с именем 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

Frank Eno 18.09.2018 14:09

ИМО, имя свойства для структуры, такой как ваш объект-указатель, всегда должно быть «указателем», поэтому вы можете перейти непосредственно к указателю, а не искать вокруг, чтобы увидеть, содержит ли объект что-то, похожее на указатель.

James 18.09.2018 14:19

это сработало, большое спасибо! Как насчет моего второго вопроса о логическом значении false, которое не отображается как 0?

Frank Eno 18.09.2018 14:27

PS: хотя теперь в моем столбце «массив» отображается только «Массив», а не «элемент1» «элемент2» ...

Frank Eno 18.09.2018 14:30

Для логического вам нужно что-то вроде этого: else if (is_bool($value)){ echo '<td>'.($value?'1':'0').'</td>';}

cuzi 18.09.2018 14:31

Большое спасибо, я хотел бы поболтать с вами для получения дополнительной информации, если вы доступны для найма

Frank Eno 18.09.2018 14:36

Вам по-прежнему нужен исходный код для отображения «нормального» массива, поэтому поместите исходный код после if-clause Джеймса, как этот else if (is_array($value)) {..., и удалите код, который был специально для указателя.

cuzi 18.09.2018 14:52

ты прав, я понял это минуту назад, это работает как шарм, большое спасибо! Можно ли в частном порядке связаться с вами по некоторым запросам PHP / JSON, возможно, нанять вас?

Frank Eno 18.09.2018 15:01

Другие вопросы по теме