Php 将数组转换为更具可读性和逻辑性的结构
我有一个大约200条记录的数组,如下所示:Php 将数组转换为更具可读性和逻辑性的结构,php,arrays,Php,Arrays,我有一个大约200条记录的数组,如下所示: [0] => Array ( [sid] => 54 [sname] => vISL User book [sdate] => 2012-03-01 00:00:00 [pid] => 262 [cid] => 95 [at] =>
[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和sdate值。。。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
)
)
)
获得所需阵列结构的最佳方法是什么 我会说循环遍历数组,然后使用
var\u 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).'; ?>');
$tmp=Array();
$out=Array();
foreach($行输入){
$tmp[$row['sid'][]=$row;
}
foreach($tmp作为$key=>$rows){
$tmp[$key]=数组(
“sid”=>$rows[0]['sid'],
“sname”=>$rows[0]['sname'],
“sdate”=>$rows[0]['sdate'],
“parr”=>数组()
);
foreach($行作为$行){
$tmp[$key]['parr'][]=数组(
“pid”=>$row['pid'],
“cid”=>$row['cid'],
“at”=>$row['at'],
“金额”=>$row[“金额”],
“psdate”=>$row['psdate'],
“first_name”=>$row['first_name'],
“姓氏”=>$row[“姓氏”],
“pcid”=>$row['pcid'],
“cname”=>$row['cname']
);
}
}
$out=数组_值($tmp);
文件内容(“tmp.php”,”;
我会说循环遍历数组,然后使用var\u 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).'; ?>');
$tmp=Array();
$out=Array();
foreach($行输入){
$tmp[$row['sid'][]=$row;
}
foreach($tmp作为$key=>$rows){
$tmp[$key]=数组(
“sid”=>$rows[0]['sid'],
“sname”=>$rows[0]['sname'],
“sdate”=>$rows[0]['sdate'],
“parr”=>数组()
);
foreach($行作为$行){
$tmp[$key]['parr'][]=数组(
“pid”=>$row['pid'],
“cid”=>$row['cid'],
“at”=>$row['at'],
“金额”=>$row[“金额”],
“psdate”=>$row['psdate'],
“first_name”=>$row['first_name'],
“姓氏”=>$row[“姓氏”],
“pcid”=>$row['pcid'],
“cname”=>$row['cname']
);
}
}
$out=数组_值($tmp);
文件内容(“tmp.php”,”;
我假定您从联接查询中获得这些数组结果。
我认为如果你把这些数据从数据库中分离出来,那就容易多了。
因此,您的问题类似于此线程:
无论如何,您可以尝试以下方法:
$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];
}
}
}
);
我假定您从联接查询中获得这些数组结果。 我认为如果你把这些数据从数据库中分离出来,那就容易多了。 因此,您的问题类似于此线程: 无论如何,您可以尝试以下方法:
$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];
}
}
}
);
您是如何读取数据的?答案通常是您必须自己创建此自定义数组。您是如何读取数据的?答案通常是您必须自己创建此自定义数组。