我这里有数据:
Array
(
[3] => Array
(
[SiteID] => 3
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 17
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
)
[3] => Array
(
[SiteID] => 3
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 211
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
)
[4] => Array
(
[SiteID] => 4
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 17
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
)
[4] => Array
(
[SiteID] => 4
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 12
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
)
[5] => Array
(
[SiteID] => 2
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 11
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
)
)
)
然后我需要制作一个名为"CorpAID"的新密钥,指向拥有相同SiteID的OwnerAID列表,这意味着SiteID可以由一个或多个OwnerAID拥有。结果应如下所示:
Array
(
[0]=> Array
(
[SiteID] => 3
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 17
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
[CorpAID] => Array
(
[0] => 17
[1] => 211
)
)
[1]=> Array
(
[SiteID] => 3
[Balance] => 19000.00
[MinBalance] => 100000.00
[MaxBalance] => 1000000.00
[OwnerAID] => 17
[GroupID] => 1
[Deposit] => 1500
[Redemption] => 1000
[Reload] => 1000
[CorpAID] => Array
(
[0] => 12
[1] => 17
)
)
有可能做到吗?请帮助我,并以正确的方式引导我。提前谢谢你。
这是未经测试的代码,但阅读正在发生的事情应该有点直观。我假设SiteID
是要分组的字段。
$tmp =&$out[$record['SiteID']];
只是避免一遍又一遍地键入$out[$record['SiteID']]
的快捷方式。
$out = array();
foreach ($records as $record) {
$tmp = &$out[$record['SiteID']];
if (isset($tmp)) {
$tmp['CorpAID'][] = $record['OwnerAID'];
} else {
$tmp = $record;
$tmp['CorpAID'] = array($record['OwnerAID']);
}
}
顺便说一句,在MySQL中,你也可以这样做以使PHP中的工作更容易:
SELECT GROUP_CONCAT(OwnerAID) AS CorpAID
FROM ...
GROUP BY SiteID;
我建议你创建一个小函数来比较多维数组的键和值:
function findInArray($key, $value, $array){
foreach($array as $key=>$row){
if(array_key_exists($key, $row){
if($row[$key] == $value)
return $key;
}
}
return -1;
}
然后执行数组foreach
以在正确的位置设置值,我们搜索结果数组中是否已存在SiteID
,如果没有,我们将其添加到集合中,否则我们只查看OwnerAID
是否已经在CorpAID
数组中或我们添加它。这样我们避免了重复输入(似乎您不希望在示例中发布):
$result_array = array();
foreach($array as $row){
$key = findInArray('SiteID', $row['SiteID'], $result_array);
if($key == -1){
$temp = $row;
$temp['CorpAID'] = array($row['OwnerAID']);
$result_array[] = $temp;
}
else {
if(findInArray('CorpAID', $row['OwnerAID'], $result_array) == -1){
$result_array[$key]['CorpAID'][] = $row['OwnerAID'];
}
}
}
要实现所需的内容,您需要遍历值并为每个条目分配一个新的CorpAID
字段。然后,该CorpAID
字段需要通过SiteID
引用该值,该值将基于每个OwnerAID
的迭代而构建。
引用很重要,因为当您将其分配给第一个元素时,这些元素尚未完全填充,因为在编写时,每个SiteID
可能有多个OwnerAID
。
这个声音越复杂,代码就越小。由于这使用了参考,因此我取消设置它们以稍后清理:
$table = array();
foreach($data as &$item)
{
$item['CorpAID'] = &$table[$item['SiteID']];
$item['CorpAID'][] = $item['OwnerAID'];
}
unset($item);
unset($table);
但是,通过将站点信息(数据中经常重复)与所有者信息分开,您可以受益更多。它可以像上面一样工作。