구조

2012-06-26 3 views
1

더 읽기 및 논리적 나는 약 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 
     ) 

나는 다음과 같은 형식으로이 배열을 변환 할.

[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 
       ) 
     ) 
) 

것은 어떤 배열의 필요한 구조를 얻을 수있는 가장 좋은 방법이 될 것입니다 : 그 이유는 CNAME ... 그 SID, SNAME 및 sdate 조합이 PID, CID의 여러 값을 가질 수있다?

+1

어떻게 당신이 데이터를 읽고? – craig1231

+1

[이 질문들] (http://stackoverflow.com/search?q=php+format+array)에 대한 답은 일반적으로 *이 사용자 지정 배열을 직접 만들어야합니다. –

답변

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).'; ?>'); 
0
$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; 
} 
0

난 당신이 조인 쿼리에서 그 배열 결과를 얻을 추정. 데이터베이스에서 데이터를 분리하면 더 쉽게 생각할 수 있습니다. 그래서 귀하의 질문에이 스레드와 유사하다 : 어쨌든 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]; 
      } 
     } 
    } 
);