Hướng dẫn how to group by array value in php? - cách nhóm theo giá trị mảng trong php?

Dưới đây là một hàm sẽ lấy một mảng làm đối số đầu tiên và một tiêu chí (hàm chuỗi hoặc chức năng gọi lại) làm đối số thứ hai. Hàm trả về một mảng mới nhóm mảng theo yêu cầu.

/**
 * Group items from an array together by some criteria or value.
 *
 * @param  $arr array The array to group items from
 * @param  $criteria string|callable The key to group by or a function the returns a key to group by.
 * @return array
 *
 */
function groupBy($arr, $criteria): array
{
    return array_reduce($arr, function($accumulator, $item) use ($criteria) {
        $key = (is_callable($criteria)) ? $criteria($item) : $item[$criteria];
        if (!array_key_exists($key, $accumulator)) {
            $accumulator[$key] = [];
        }

        array_push($accumulator[$key], $item);
        return $accumulator;
    }, []);
}

Đây là mảng đã cho:

$arr = array(
    'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
    'b' => array ( 'id' => 40, 'name' => 'meeting' ),
    'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
    'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
    'e' => array ( 'id' => 10, 'name' => 'bananas' ),
    'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
    'g' => array ( 'id' => 50, 'name' => 'football' )
);

Và các ví dụ sử dụng chức năng với một chuỗi và chức năng gọi lại:

$q = groupBy($arr, 'id');
print_r($q);

$r = groupBy($arr, function($item) {
    return $item['id'];
});
print_r($r);

Kết quả giống nhau trong cả hai ví dụ:

Array
(
    [20] => Array
        (
            [0] => Array
                (
                    [id] => 20
                    [name] => chimpanzee
                )

            [1] => Array
                (
                    [id] => 20
                    [name] => dynasty
                )

        )

    [40] => Array
        (
            [0] => Array
                (
                    [id] => 40
                    [name] => meeting
                )

        )

    [50] => Array
        (
            [0] => Array
                (
                    [id] => 50
                    [name] => chocolate
                )

            [1] => Array
                (
                    [id] => 50
                    [name] => fantasy
                )

            [2] => Array
                (
                    [id] => 50
                    [name] => football
                )

        )

    [10] => Array
        (
            [0] => Array
                (
                    [id] => 10
                    [name] => bananas
                )

        )

)

Vượt qua cuộc gọi lại là quá mức quá mức trong ví dụ trên, nhưng sử dụng cuộc gọi lại sẽ tìm thấy việc sử dụng nó khi bạn chuyển trong một mảng các đối tượng, một mảng đa chiều hoặc có một số điều tùy ý mà bạn muốn nhóm theo.

array_group_by

(Php 5> = 5,4) array_group_by - Nhóm một mảng bằng một khóa nhất định.
array_group_by — Groups an array by a given key.

Sự mô tả

array|null array_group_by( array $array, mixed $key1 [, mixed $... ] )

Nhóm một mảng thành các mảng bằng một $key nhất định hoặc tập hợp các khóa, được chia sẻ giữa tất cả các thành viên mảng.

Dựa trên chức năng ____1010 của Jake Zatecky.

Fork này cung cấp:

  • Tham số $key có thể là một đóng cửa

Thông số

  • $arr = array(
        'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
        'b' => array ( 'id' => 40, 'name' => 'meeting' ),
        'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
        'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
        'e' => array ( 'id' => 10, 'name' => 'bananas' ),
        'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
        'g' => array ( 'id' => 50, 'name' => 'football' )
    );
    
    2 - Mảng để nhóm được thực hiện trên.

  • $key - Chìa khóa để nhóm hoặc tách bởi. Có thể là một chuỗi, một số nguyên, phao hoặc một cuộc gọi lại. Nếu khóa là null, phần tử lặp bị bỏ qua. Nếu khóa là một cuộc gọi lại, nó phải trả về một khóa hợp lệ từ mảng.

    $arr = array(
        'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
        'b' => array ( 'id' => 40, 'name' => 'meeting' ),
        'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
        'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
        'e' => array ( 'id' => 10, 'name' => 'bananas' ),
        'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
        'g' => array ( 'id' => 50, 'name' => 'football' )
    );
    
    4

  • $arr = array(
        'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
        'b' => array ( 'id' => 40, 'name' => 'meeting' ),
        'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
        'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
        'e' => array ( 'id' => 10, 'name' => 'bananas' ),
        'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
        'g' => array ( 'id' => 50, 'name' => 'football' )
    );
    
    5-Các khóa bổ sung để nhóm các bộ phụ tiếp theo.

Trả về giá trị

Trả về một mảng đa chiều, với mỗi chiều chứa các phần tử được nhóm theo (các) phím được truyền.

Errors/Exceptions

Nếu $key không phải là một trong những loại được chấp nhận

$arr = array(
    'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
    'b' => array ( 'id' => 40, 'name' => 'meeting' ),
    'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
    'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
    'e' => array ( 'id' => 10, 'name' => 'bananas' ),
    'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
    'g' => array ( 'id' => 50, 'name' => 'football' )
);
7 sẽ bị ném và
$arr = array(
    'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
    'b' => array ( 'id' => 40, 'name' => 'meeting' ),
    'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
    'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
    'e' => array ( 'id' => 10, 'name' => 'bananas' ),
    'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
    'g' => array ( 'id' => 50, 'name' => 'football' )
);
8 được trả về.

Ví dụ

Ví dụ #1 mảng_group_by () ví dụ

$records = [
	[
		"state"  => "IN",
		"city"   => "Indianapolis",
		"object" => "School bus"
	],
	[
		"state"  => "IN",
		"city"   => "Indianapolis",
		"object" => "Manhole"
	],
	[
		"state"  => "IN",
		"city"   => "Plainfield",
		"object" => "Basketball"
	],
	[
		"state"  => "CA",
		"city"   => "San Diego",
		"object" => "Light bulb"
	],
	[
		"state"  => "CA",
		"city"   => "Mountain View",
		"object" => "Space pen"
	]
];

$grouped = array_group_by( $records, "state", "city" );

Ví dụ trên sẽ xuất ra:

Array
(
	[IN] => Array
		(
			[Indianapolis] => Array
				(
					[0] => Array
						(
							[state] => IN
							[city] => Indianapolis
							[object] => School bus
						)

					[1] => Array
						(
							[state] => IN
							[city] => Indianapolis
							[object] => Manhole
						)

				)

			[Plainfield] => Array
				(
					[0] => Array
						(
							[state] => IN
							[city] => Plainfield
							[object] => Basketball
						)

				)

		)

	[CA] => Array
		(
			[San Diego] => Array
				(
					[0] => Array
						(
							[state] => CA
							[city] => San Diego
							[object] => Light bulb
						)

				)

			[Mountain View] => Array
				(
					[0] => Array
						(
							[state] => CA
							[city] => Mountain View
							[object] => Space pen
						)

				)

		)
)

Cài đặt

Với nhà soạn nhạc

$ composer require mcaskill/php-array-group-by

Không có nhà soạn nhạc

Tại sao bạn không sử dụng nhà soạn nhạc?Tải xuống

$arr = array(
    'a' => array ( 'id' => 20, 'name' => 'chimpanzee' ),
    'b' => array ( 'id' => 40, 'name' => 'meeting' ),
    'c' => array ( 'id' => 20, 'name' => 'dynasty' ),
    'd' => array ( 'id' => 50, 'name' => 'chocolate' ),
    'e' => array ( 'id' => 10, 'name' => 'bananas' ),
    'f' => array ( 'id' => 50, 'name' => 'fantasy' ),
    'g' => array ( 'id' => 50, 'name' => 'football' )
);
9 từ ý chính và lưu tệp vào đường dẫn dự án của bạn ở đâu đó.