>


다음과 같은 배열이 있습니다.

$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)


  • 답변 # 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() 를 사용하여 출력을 다시 색인화하십시오. .

    코드 (데모)

    $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',
      ),
    )
    
    

관련 자료

  • 이전 c++ - 64 비트 개발에 해당하는 0xDEADBEEF?
  • 다음 html - 창 축소시 겹치는 버튼