为某些属性创建多维数组

时间:2019-09-03 14:24:05

标签: php arrays multidimensional-array pdo

我有这个数组结构。 ID 145是一个与另一个表具有两个关联关系的请求-项目ID 16和17。因此,一个请求可以有多个项目。

现在,我想更改此结构并合并重复的信息。我的意思是合并[0][n]。因此funding_project_namerelation_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
          )
      )
    )

1 个答案:

答案 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);

参考:array-keysarray_uniquearray-columnarray_map