如何动态地将SQL查询结果转换为多维数组?

5

这是查询字符串。

$query = "SELECT t.id, t.assignee, t.owner, 
            d.code, d.status, d.target_completion_date, 
            d.target_extension_date, d.submission_date, d.approval_date,
            d.revision_start_date, d.revision_completion_date, d.message, 
            ty.name, f.orig_name, f.new_name, 
            b.payment_date, b.discount, b.total_cost, b.amount_payed, b.edit_level, 
            b.billing_type, b.pages, b.words
      FROM tasks t
      INNER JOIN details d ON t.detail_id = d.id
      INNER JOIN billing b ON t.billing_id = b.id
      INNER JOIN TYPE ty ON d.document_type_id = ty.id
      INNER JOIN files f ON t.file_id = f.id
      WHERE t.assignee = 'argie1234'";

以下是我想要查询结果转换成的数组。

$user = array('allTask'=>array(array('taskid' => 1,
                                     'assignee'=>'argie1234',
                     'owner'=>'austral1000',
                     'details' => array( 'code' => 'E',
                     'status'=>'TC',
                     'targetCompletionDateUTC'=>'1379401200',
                     'targetExtentionDateUTC'=>'1379401200',    
                     'submissionDateUTC'=>'1379401200',
                     'approvalDateUTC'=>'1379401200',
                     'revisionStartDateUTC'=>'1379401200',
                     'revisionCompletionDateUTC'=>'1379401200',
                     'messageToEditor'=>'Please work on it asap.',
                     'documentType' => 'Thesis'),
                     'file' => array('orig_name' =>'originalname.docx',
                                     'new_name' => 'newname.docx'),
                         'billing'=>array('paymentDate'=>'July 26,2013 12:40',
                          'discount' => '0',
                           'totalRevisionCharge' => '$20.00',
                          'totalAmountPayed' => '$20.00',
                          'revisionLevel' => '1',
                          'chargeType'=> '1',
                          'numPages' => '60',
                          'numWords' => '120,000' ) ),

                  array('taskid' => 12, 
                                  'assignee'=>'argie1234',
                                  'owner'=>'usaroberto',
                  'details' => array( 'code' => 'E',
                  'status'=>'TC',
                  'targetCompletionDateUTC'=>'1379401200',
                  'targetExtentionDateUTC'=>'1379401200',   
                  'submissionDateUTC'=>'1379401200',
                  'approvalDateUTC'=>'1379401200',
                  'revisionStartDateUTC'=>'1379401200',
                  'revisionCompletionDateUTC'=>'1379401200',
                  'messageToEditor'=>'Please work on it asap.',
                  'documentType' => 'Thesis'),
                  'file' => array('orig_name' => 'originalname.docx',
                                 'new_name' => 'newname.docx'),
                          'billing'=>array('paymentDate'=>'July 26,2013 12:40',
                           'discount' => '0',
                           'totalRevisionCharge' => '$20.00',
                           'totalAmountPayed' => '$20.00',
                           'revisionLevel' => '1',
                           'chargeType'=> '1',
                           'numPages' => '60',
                           'numWords' => '120,000' ) ),

    'account' => array( 'username' => 'marooon55',
            'emailadd' => 'marooon@yahoo.com',
            'firstname' => 'Maroon',
            'initial' => 'E',
            'lastname' => 'Young',
            'country' => 'Australia',
            'gender' => 'M',
            'password' =>'360e2801190744a2af74ef6cbfdb963078b59709',
            'activationDate' => '2013-09-13 14:30:34') );

我该如何创建上述数组?我知道如何定义多维数组,但遗憾的是,我很难动态创建这个复杂的数组。作为一个初学者,我甚至不知道从哪里开始。

3个回答

0
你可以像这里一样创建数组。我不会把整个东西都写出来,但是大概是这样的...
    $result = $mysqli->query($query); // however you query the db is up to you.
    $row = $result->fetch_assoc(); //same as query use your prefered method to fetch
    $user = array('allTask'=>array(array('taskid' => $row['id'],
                                 'assignee'=>$row['assignee'],
                 'owner'=>$row['owner'],
                 'details' => array( 'code' => $row['code'],
                 'status'=>$row['status'],

...等等,希望这对您有意义。


我实际上尝试过这种方法,但是$user['allTask']实际上是一个数组,它不仅包含数组,还包含另一个数组和非标量值。我似乎无法弄清楚何时使用foreach循环来遍历每个后续数组并同时创建数组。如果$user['allTask']只包含1个数组(任务数据),则此解决方案是可以的。感谢您的回复。 - Kuya Noel
您可以轻松地检查所有任务中当前项是否需要通过检查当前值是否为数组来进行迭代,例如 if(is_array($value)){foreach($value as $k =>$v){//do stuff}} 您可以使用递归或者由于您知道将有多少维度,因此可以仅检查那么多级别...或者在键是您期望包含数组的键时进行迭代...就像他们所说的,有多种方法可以解决问题。 - Bryan

0
首先设置一个结构数组,定义哪些列将存储在子数组中,例如:
$struc=array('Id'->0, 'assignee'->0, 'owner'->0, 
            'code'->'detail', 'status'->'detail', 'target_completion_date'->'detail', 
            'target_extension_date'->'detail', 'submission_date'->'detail', 'approval_date'->'detail',
            'revision_start_date'->'detail', 'revision_completion_date'->'detail', 'message'->'detail', 
            'name'->'file', 'orig_name'->'file', 'new_name'->'file', 
            'payment_date'->'billing', 'discount'->'billing', 'total_cost'->'billing', 'amount_payed'->'billing', 'edit_level'->'billing', 'billing_type'->'billing', 'words');

在您的while ($a=mysqli_fetch_assoc($res))循环中,您现在可以使用此结构来决定是否要直接将元素存储在目标数组中,还是要将其放置在以此结构数组命名的子数组中。就像这样:
$res=mysqli_query($con,$sql);
$arr=array();
while($a=mysqli_fetch_assoc($res)) {
  // within result loop: $a is result from mysqli_fetch_assoc()
  $ta=array(); // temp array ...
  foreach ($a as $k => $v){
    if ($struc[$k]) $ta[struc[$k]][$k]=$v;
    else $ta[$k]=$v;
  }
  $arr[]=$ta;  // add to target array 
}

这是完整的代码,不需要更多了。它是在我的iPod上打出来的,因此尚未经过测试。

生成的数组应该等同于您的$user['allTask'] 数组。


嘿,谢谢。我已经完成了那个。目前,我的问题是如何使用while循环和foreach循环来遍历数组(SQL结果数组),并动态创建PHP数组。我只需要一个样例语法来做到这一点。 - Kuya Noel

0

这里有一个例子可能会帮助到你。试着从简单的多维数组开始,一旦你掌握了它,就可以转向构建复杂数组。然后你会发现你想要构建的数组并没有你最初想象中那么难。

$mycomplexarray = array('key1' => array('val1', 'val2'), 'key2' => array('val3', 'val4' => array('val5', 'val6') ) );


谢谢您的早期回复。是的,我正在进行实验,并且开始逐渐掌握它。如果有人能够友好地向我展示创建该数组的语法,那将非常有帮助。 - Kuya Noel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接