TIP게시판

제목 배열 gorup by 함수
글쓴이 kaido 작성시각 2019/10/14 18:01:41
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 264   RSS

배열별로 집계를 내는 방법이 없을까 하다 찾아보니 이런식으로 구현이 가능 하더군요.

혹시 찾는분이 있을까봐 코드 공유해 드립니다 ㅎㅎ

PS . 앞에 $this 제거 하고 함수 형태로 사용하셔도 무방합니다

 

class group {

public function group_by($column_name, $rows)
    {
        $result = array();
        $groups = $this->distinct($rows, $column_name);
        foreach ($groups as $group) {
            $result[$group] = $this->where($rows, array($column_name => $group));
        }
        return $result;
    }

    public function distinct($rows, $column_name)
    {
        $column_values = array();
        foreach ($rows as $row) {
            $column_values[$row[$column_name]] = 1;
        }
        return array_keys($column_values);
    }

    public function where($rows, $params)
    {
        $result = array();
        foreach ($rows as $row) {
            $row_matched = true;
            foreach ($params as $column_name => $column_value) {
                if (!array_key_exists($column_name, $row) || $row[$column_name] != $column_value) {
                    $row_matched = false;
                    break;
                }
            }
            if ($row_matched)
                $result[] = $row;
        }
        return $result;
    }

}

$group = new group();
$arr = [ [0 => 'key'=>"A"] , [1 => 'key'=>"B"] , [2 => 'key'=>"B"]  ];
print_r($group->group_by('배열키값 key', $arr));

 

 이전글 wp 스타일 후크 헬퍼 (2)

댓글

변종원(웅파) / 2019/10/14 18:58:47 / 추천 0
요런 것도 있습니다.

$a = [
    ['name'=>'a', 'age'=>3],
    ['name'=>'a', 'age'=>4],
    ['name'=>'b', 'age'=>5]
];

$ids = array_column($a, 'name');
$ids = array_unique($ids);
$a = array_filter($a, function ($key, $value) use ($ids) {
    return in_array($value, array_keys($ids));
}, ARRAY_FILTER_USE_BOTH);
변종원(웅파) / 2019/10/15 09:08:11 / 추천 0

끝판왕

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));