如何将sql结果动态转换为多维数组?

Posted

技术标签:

【中文标题】如何将sql结果动态转换为多维数组?【英文标题】:How to turn sql result to multi-dimensional array dynamically? 【发布时间】:2013-09-18 20:48:13 【问题描述】:

这是查询字符串。

$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') );

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

【问题讨论】:

【参考方案1】:

这是一个可能对您有所帮助的示例。尝试从简单的多维数组开始,一旦掌握了它,就可以开始构建复杂的数组。然后你会发现你想要构建的数组并没有你最初想象的那么难。

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

【讨论】:

感谢您的早日回复。是的,我正在试验,我开始掌握它的窍门。如果有人能向我展示创建该数组的语法,那将会很有帮助。【参考方案2】:

您可以像这里一样创建数组。我不会把整个事情都写出来,但是像这样......

    $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 个数组(即任务数据),则此解决方案可以。感谢您的回复。 您可以通过检查当前值是否为数组来轻松检查所有任务中的当前项是否需要迭代,即.. if(is_array($value))foreach($value as $ k =>$v)//do stuff 你可以使用递归,或者因为你知道你将拥有多少个维度,你可以只检查多少个级别..或者当键是你希望包含一个数组......正如他们所说的,不止一种给猫剥皮的方法。【参考方案3】:

首先设置一个结构数组,定义哪些列将存储在子数组中,例如

$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 数组。我只需要一个示例语法来做到这一点。

以上是关于如何将sql结果动态转换为多维数组?的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何将SQL查询结果转为多维数组,并按查询行输出

如何将数组列表转换为多维数组

如何将多维数组转换为json对象[关闭]

将多维数组转换为一维数组的算法

如何将多维PHP数组转换为html表

如何从 mySQL 和 PHP 检索结果为多维数组?