我有这个数组结构。 ID 145是一个与另一个表具有两个关联关系的请求-项目ID 16和17。因此,一个请求可以有多个项目。
现在,我想更改此结构并合并重复的信息。我的意思是合并[0]
和[n]
。因此funding_project_name
和relation_id
将成为新子数组的两个条目。
[145] => Array
(
[0] => Array
(
[firstname] => John
[institution] => Harvard
[funding_project_name] => Project 1 #add to array funding_project_name - [0]
[relation_id] => 16 #add to array relation_id - [0]
)
[1] => Array
(
[firstname] => John //discard
[institution] => Harvard //discard
[funding_project_name] => Project 2 #add to array funding_project_name - [1]
[relation_id] => 17 #add to array relation_id - [1]
)
)
我使用以下命令实现了此输出:
$query->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC)
任何想法我如何获得预期的结构?已经尝试了一些嵌套的foreach,但是不确定如何对项目进行分组
预期:
[145] => Array
(
[firstname] => John
[institution] => Harvard
[projects] => Array(
[0] => Array(
[funding_project_name] => Project 1
[relation_id] => 16
)
[1] => Array(
[funding_project_name] => Project 2
[relation_id] => 17
)
)
)
答案 0 :(得分:1)
如果仅两个字段在变化,那么您可以循环使用所有键并收集数据-以后只需根据需要查找唯一性并转换为字符串:
$array = array_map(function ($arr) {
foreach(array_keys($arr[0]) as $k) {
$vals = array_column($arr, $k);
$e[$k] = count(array_unique($vals)) == 1 ? $vals[0] : $vals;
}
return $e;
}, $array);
实时示例:3v4l
如果您愿意-这是较旧的代码版本:
$array = array_map(function ($arr) {
$a = array('first' => $arr[0]['first'], 'last' => $arr[0]['last']);
foreach($arr as $e) {
$a['funding_project_name'][] = $e['funding_project_name'];
$a['relation_id'][] = $e['relation_id'];
}
return $a;}, $array);