【问题标题】:Is there a way to create an array of objects using php and create an json file from it有没有办法使用php创建一个对象数组并从中创建一个json文件
【发布时间】:2021-08-14 19:30:24
【问题描述】:

我正在尝试使用来自多个表的数据创建一个对象数组,假设有一个表保存患者数据,还有一个表保存诊断,以及每个入院患者的药物,我需要创建具有以下输出的对象数组。 Screen shot

我必须编写以下代码

 <?php
    // Db configs.
    define('HOST', 'localhost');
   define('PORT', 3306);

    define('DATABASE', 'new_nhif');
    define('USERNAME', 'root');
    define('PASSWORD', '');

error_reporting(E_ALL);
ini_set('display_errors', 1); 

$mysqliDriver = new mysqli_driver();
$mysqliDriver->report_mode = (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE, PORT);

$sql = sprintf(
        'SELECT 
                nh.MembershipNo,
                nh.FullName,
                nh.id as nhid,
                lb.labrequest,
                fd.diagnosis,
                fd.DiseaseCode,
                fd.CreatedBy as fdcrb,
                dz.name

            FROM nhif_data AS nh 
            LEFT JOIN laboratory AS lb ON lb.re_id = nh.id 
            LEFT JOIN foliodisease AS fd ON fd.re_id = nh.id
            LEFT JOIN dawa_zilizotoka AS dz ON dz.re_id = nh.id
            WHERE  lb.re_id = nh.id
            AND  fd.re_id = nh.id
            AND  dz.re_id = nh.id
            -- GROUP BY nh.MembershipNo
           '
);

$obj = new stdClass;


$result = $connection->query($sql);

$vipimo = array();
$dawa = array();
$all = array();


if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            
            // print_r(json_encode(['entities'=> $row],JSON_PRETTY_PRINT));

             $obj->MembershipNo = $row['MembershipNo'];
             $obj->FullName = $row['FullName'];

             $id = $row['nhid'];
            

             $sql2 = "SELECT * FROM foliodisease WHERE re_id ='$id'";
        
             $result1 = $connection->query($sql2);
            

             if ($result1->num_rows > 0) {

                while($row2 = $result1->fetch_assoc()) {
                       
                        $vipimo['diagnosis']= $row2['diagnosis'];
                        $vipimo['DiseaseCode']= $row2['DiseaseCode'];

                        $obj->FolioDiseases[] =  $vipimo;
                }
            
             }


             $sql3 = "SELECT * FROM dawa_zilizotoka WHERE re_id = $id";
        
             $result3 = $connection->query($sql3);
            

             if ($result3->num_rows > 0) {

                while($row3 = $result3->fetch_assoc()) {
                       
                        $dawa['name']= $row3['name'];

                        $obj->FolioItems[] =  $dawa;
                }
            
             }


             $all[] = $obj;

             }

             print_r(json_encode(['entities'=> $all], JSON_PRETTY_PRINT));


     
     }
?>

它给出以下输出

{
  "entities": [
    {
      "MembershipNo": "602124502",
      "FullName": "Omari M Simba",
      "FolioDiseases": [
        {
          "diagnosis": "typhoid",
          "DiseaseCode": "J54"
        },
        {
          "diagnosis": "homa",
          "DiseaseCode": "L54"
        },
        {
          "diagnosis": "malaria",
          "DiseaseCode": "b54"
        }
      ],
      "FolioItems": [
        {
          "name": " Fluticasone furoate\t"
        },
        {
          "name": " Acyclovir  Eye ointment\t"
        },
        {
          "name": " Acyclovir\t"
        },
        {
          "name": " Acyclovir\t"
        }
      ]
    },
    {
      "MembershipNo": "602124502",
      "FullName": "Omari M Simba",
      "FolioDiseases": [
        {
          "diagnosis": "typhoid",
          "DiseaseCode": "J54"
        },
        {
          "diagnosis": "homa",
          "DiseaseCode": "L54"
        },
        {
          "diagnosis": "malaria",
          "DiseaseCode": "b54"
        }
      ],
      "FolioItems": [
        {
          "name": " Fluticasone furoate\t"
        },
        {
          "name": " Acyclovir  Eye ointment\t"
        },
        {
          "name": " Acyclovir\t"
        },
        {
          "name": " Acyclovir\t"
        }
      ]
    }
  ]
}

我的桌子是

nhif_data ---- nhif_data,

实验室---- laboratory,

叶状体病--- foliodisease ,

dawa_zilizotoka ---- dawa_zilizotoka

【问题讨论】:

  • 可能是参考问题。您使用的是在开始时创建的相同对象,因此对其所做的任何修改都会反映在您的数组中。将对象创建移动到while 循环内(在开始处),以便在每次迭代中创建一个新实例。
  • 如果您不使用任何占位符,为什么要sprintf()?这是一个完全没用的电话。迭代查询是不行的。
  • 是的,它的工作原理现在我将对象创建移动到一个while循环中并且它工作

标签: php arrays json object


【解决方案1】:

您不需要为所需的输出创建对象数组,'json_encode()' 基本上可以将任何东西对象化,这意味着,无论您使用 'json_encode()' 函数存储什么,'json_decode()' 将始终返回你是一个对象/对象数组,等等。

您只需要从数据库中获取记录,根据需要进行子嵌套,将记录附加到数组中,只需 'json_encode()';使用 'json_decode()',你最终会得到一个对象数组。

$JSONItem = []; // Initialize the array

while($Record = $Query->fetch_assoc()){ // Iterate through main recordset
    ...subsequent child query   
    // Iterate though child recordset
    while($ChildRecord = $ChildQuery->fetch_assoc())$Record["Child"][] = $ChildRecord; // Append child node to main record
    $JSONItem[] = $Record; // Append record for JSON conversion
}

var_dump(json_decode(json_encode($JSONItem))); // This should return an array of ojects

以下应该可以更好地理解机制;

var_dump(json_decode(json_encode([
    ["ID" => 1, "Name" => "Apple", "Source" => ["Name" => "Amazon", "URL" => "http://Amazon.Com", ], ], 
    ["ID" => 2, "Name" => "Banana", "Source" => ["Name" => "eBay", "URL" => "http://eBay.Com", ], ], 
    ["ID" => 3, "Name" => "Carrot", "Source" => ["Name" => "GearBest", "URL" => "http://GearBest.Com", ], ], 
])));

或者,对于较新的 PHP 版本,我希望您可以简单地准备/构造数组并使用类似的东西对其进行对象化;

$JSON = (object) $JSONItem;

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2013-06-04
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多