使用PHP内部的对象过滤JSON数组

时间:2018-09-18 11:42:39

标签: php arrays json database

我有一个特殊的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 值,如下所示:

“ tRe4Fda5”

现在,这是我的桌子的样子:

My HTML table output

这是我的foreach PHP代码(在表行中):

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 (是)?

2 个答案:

答案 0 :(得分:2)

您可以在第二个循环中查看对象,以查看它是否具有称为type的属性以及该属性是否设置为__pointer。

[Code]

function CheckNodeJs(var Message: string): Boolean;
var
  NodeFileName: string;
  NodeMS, NodeLS: Cardinal;
  NodeMajorVersion, NodeMinorVersion: Cardinal;
begin
  { Search for node.exe in paths listed in PATH environment variable }
  NodeFileName := FileSearch('node.exe', GetEnv('PATH'));
  Result := (NodeFileName <> '');
  if not Result then
  begin
    Message := 'Node.js not installed.';
  end
    else
  begin
    Log(Format('Found Node.js path %s', [NodeFileName]));
    Result := GetVersionNumbers(NodeFileName, NodeMS, NodeLS);
    if not Result then
    begin
      Message := Format('Cannot read Node.js version from %s', [NodeFileName]);
    end
      else
    begin
      { NodeMS is 32-bit integer with high 16 bits holding major version and }
      { low 16 bits holding minor version }

      { shift 16 bits to the right to get major version }
      NodeMajorVersion := NodeMS shr 16; 
      { select only low 16 bits }
      NodeMinorVersion := NodeMS and $FFFF;
      Log(Format('Node.js version is %d.%d', [NodeMajorVersion, NodeMinorVersion]));
      Result := (NodeMajorVersion >= 8);
      if not Result then
      begin
        Message := 'Node.js is too old';
      end
        else
      begin
        Log('Node.js is up to date');
      end;
    end;
  end;
end;

function InitializeSetup(): Boolean;
var
  Message: string;
begin
  Result := True;
  if not CheckNodeJs(Message) then
  begin
    MsgBox(Message, mbError, MB_OK);
    Result := False;
  end;
end;

答案 1 :(得分:1)

代替

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
    }
}