【问题标题】:convert an array to more readable and logical structure将数组转换为更具可读性和逻辑性的结构
【发布时间】:2012-06-26 21:03:04
【问题描述】:

我有一个包含大约 200 条记录的数组,如下所示:

 [0] => Array
        (
            [sid] => 54
            [sname] => vISL User book
            [sdate] => 2012-03-01 00:00:00
            [pid] => 262
            [cid] => 95
            [at] => 
            [amount] => 0
            [psdate] => 2012-03-14 00:00:00
            [first_name] => Alan
            [last_name] => Darshan
            [pcid] => 95
            [cname] => Invisal
        )
 [1] => Array
        (
            [sid] => 54
            [sname] => vISL User book
            [sdate] => 2012-03-01 00:00:00
            [pid] => 263
            [cid] => 94
            [at] => 
            [amount] => 0
            [psdate] => 2012-03-14 00:00:00
            [first_name] => umed
            [last_name] => sarkar
            [pcid] => 92
            [cname] => Tisal
        )

我想将此数组转换为以下格式。原因是 sid、sname 和 sdate 组合可能有多个 pid、cid ... cname 值:

[0] => Array
(
    [sid] => 54
    [sname] => vISL User book
    [sdate] => 2012-03-01 00:00:00
    [parr] => Array
            (
                [0] => Array 
                    (
                        [pid] => 262
                        [cid] => 95
                        [at] =>
                        [amount] => 0
                        [psdate] => 2012-03-14 00:00:00
                        [first_name] => Alan
                        [last_name] => Darshan
                        [pcid] => 95
                        [cname] => Invisal
                    )
                [1] => Array
                    (
                            [pid] => 262
                            [cid] => 95
                            [at] =>
                            [amount] => 0
                            [psdate] => 2012-03-14 00:00:00
                            [first_name] => Alan
                            [last_name] => Darshan
                            [pcid] => 95
                            [cname] => Invisal
                    )                       
            )
)
[1] => Array
(
        [sid] => 53
        [sname] => tebby book
        [sdate] => 2012-04-01 00:00:00
        [parr] => Array
        (
                [0] => Array
                (
                        [pid] => 162
                        [cid] => 15
                        [at] =>
                        [amount] => 1
                        [psdate] => 2012-03-14 00:00:00
                        [first_name] => edbey
                        [last_name] => balh
                        [pcid] => 93
                        [cname] => Ansasa
                )
                [1] => Array
                (
                        [pid] => 212
                        [cid] => 92
                        [at] =>
                        [amount] => 0
                        [psdate] => 2012-03-14 00:00:00
                        [first_name] => xyz
                        [last_name] => def
                        [pcid] => 91
                        [cname] => vsall
                )
        )
)

获得所需数组结构的最佳方法是什么?

【问题讨论】:

  • 你是如何读取数据的?
  • these questions 的答案通常是必须自己创建这个自定义数组。

标签: php arrays


【解决方案1】:

我会说遍历数组,然后使用var_export 获取输出:

$tmp = Array();
$out = Array();
foreach($input as $row) {
    $tmp[$row['sid']][] = $row;
}
foreach($tmp as $key=>$rows) {
    $tmp[$key] = Array(
        "sid"  =>$rows[0]['sid'],
        "sname"=>$rows[0]['sname'],
        "sdate"=>$rows[0]['sdate'],
        "parr" =>Array()
    );
    foreach($rows as $row) {
        $tmp[$key]['parr'][] = Array(
            "pid"       =>$row['pid'],
            "cid"       =>$row['cid'],
            "at"        =>$row['at'],
            "amount"    =>$row['amount'],
            "psdate"    =>$row['psdate'],
            "first_name"=>$row['first_name'],
            "last_name" =>$row['last_name'],
            "pcid"      =>$row['pcid'],
            "cname"     =>$row['cname']
        );
    }
}
$out = array_values($tmp);
file_put_contents("tmp.php",'<?php $data = '.var_export($out,true).'; ?>');

【讨论】:

    【解决方案2】:
    $old_data = /* same as in exemple */
    
    $sids = array();
    
    foreach($old_data as $row)
    {
        if(!isset($sids[$row['sid']]))
        {
            $sids[$row['sid']] = array();
            foreach(array('sid', 'sname', 'sdate') as $keys)
            {
                $sids[$row['sid']][$keys] = $row[$keys];
            }
            $sids[$row['sid']]['parr'] = array();
        }
    
        $current_parr = array();
        foreach(array('pid', 'cid', 'at', 'amount', 'psdate', 'first_name', 'last_name', 'pcid', 'cname') as $keys)
        {
            $current_parr[$keys] = $row[$keys];
        }
    
        $sids[$row['sid']]['parr'][] = $current_parr;
    }
    

    【讨论】:

      【解决方案3】:

      我假设您从连接查询中获得了这些数组结果。 如果您将这些数据与数据库分开,我认为这会更容易。 所以你的问题类似于这个帖子:enter link description here

      不管怎样,你可以试试这个:

      $pk = 'sid';                // record pk
      $pkKeys = array(
          'pid' => array(         // subRecord pk
              'parr' => array(    // subRecords array key => array(subRecord names)
                  'pid',
                  'cid',
                  'amount',
                  'psdate',
                  'pcid',
              ),
          ),
      );
      
      $resultArr = array();
      array_walk($records, 
          function ($val, $key) use (&$resultArr, $pkKeys, $pk) {
              $mapped = array();
              foreach ($val as $itemKey => $item) {
                  if (in_array($itemKey, array_keys($pkKeys))) {
                      $populateData = $pkKeys[$itemKey];
                      $subRecordPk = key($populateData);
                      foreach($populateData[$subRecordPk] as $populateKey) {
                          if ($subRecordPk !== $populateKey) {
                              $resultArr[$val[$pk]][$subRecordPk][$val[$itemKey]][$populateKey] 
                                  = $val[$populateKey];
                              $mapped[$populateKey] = $populateKey;
                          }
                      }
                  } else if (!in_array($itemKey, $mapped)){
                      $resultArr[$val[$pk]][$itemKey] = $val[$itemKey];
                  }
              }
          }
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多