【问题标题】:Group subarrays by one column, make comma-separated values from other column within groups按一列对子数组进行分组,使组内其他列的值以逗号分隔
【发布时间】:2018-02-08 10:34:16
【问题描述】:


我有一个如下所示的数组:

$array = [
    ["444", "0081"],
    ["449", "0081"],
    ["451", "0081"],
    ["455", "2100"],
    ["469", "2100"]
];

我需要分组为一个新数组,如下所示:

array (
  0 => 
  array (
    0 => '444,449,451',
    1 => '0081',
  ),
  1 => 
  array (
    0 => '455,469',
    1 => '2100',
  ),
)

我尝试了很多脚本,但都没有成功。

function _group_by($array, $key) {
    $return = array();
    foreach($array as $val) {
        $return[$val[$key]][] = $val;
    }
    return $return;
}
$newArray = _group_by($array, 1); // (NO SUCCESS)

【问题讨论】:

  • 在 SO 上已经回答了几十个类似的问题。搜索array_reduce()

标签: php multidimensional-array grouping string-concatenation csv


【解决方案1】:

应该有更优雅的解决方案,但我能想到的最简单的就是这个。

// The data you have pasted in the question
$data = []; 
$groups = [];

// Go through the entire array $data
foreach($data as $item){
    // If the key doesn't exist in the new array yet, add it       
    if(!array_key_exists($item[1], $groups)){
        $groups[$item[1]] = [];
    }

    // Add the value to the array
    $groups[$item[1]][] = $item[0];
}

// Create an array for the data with the structure you requested
$structured = [];
foreach($groups as $group => $values){
    // With the array built in the last loop, implode it with a comma
    // Also add the 'key' from the last array to it ($group)
    $structured[] = [implode(',', $values), $group];
}

我没有对此进行测试,但类似的东西应该可以解决问题。这只是通过给定数组并以结构化方式收集所有条目(因此$groups 变量将包含共享一个键的每个组的数组条目,并且该键将对应于给定数组中每个项目中的第二个项目) .从那里开始,只需对其进行重组以获得您所要求的格式。

http://php.net/manual/en/control-structures.foreach.php

【讨论】:

    【解决方案2】:

    为此任务编写两个循环太费力了。在迭代时将isset() 与应用于输出数组的临时键一起使用。完成数据分组后,使用 array_values() 重新索引输出。

    代码 (Demo)

    $array = [
        ["444", "0081"],
        ["449", "0081"],
        ["451", "0081"],
        ["455", "2100"],
        ["469", "2100"]
    ];
    
    foreach ($array as $row) {
        if (!isset($result[$row[1]])) {
            $result[$row[1]] = $row;  // first occurrence of group, save whole row
        } else {
            $result[$row[1]][0] .= ',' . $row[0];  // not first occurrence, concat first element in group
        }
    }
    var_export(array_values($result));
    

    输出:

    array (
      0 => 
      array (
        0 => '444,449,451',
        1 => '0081',
      ),
      1 => 
      array (
        0 => '455,469',
        1 => '2100',
      ),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多