Ba khái niệm map, filter và reduce rất phổ biến và hay dùng trong Functional Programming (lập trình hàm). Nhưng với lập trình viên PHP, một ngôn ngữ có thể gọi là khá hổ lốn thì có thể bạn chưa bao giờ nghe tới hoặc biết nhưng chẳng bao giờ dùng.

Và những ai không dùng ba operations trên thì thường phải viết những đoạn code bốc smell như foreach lồng nhau, dùng mảng tạm, nhân đôi một mảng hay thay đổi giá trị của mảng đó khi không cần thiết.

Tại sao phải dùng map, filter và reduce

Ở lập trình hàm, lập trình viên không được đổi giá trị của variable và cũng không dùng vòng lặp. Thay vào đó họ dùng map, filter và reduce để:

  1. thay đổi hàng loạt
  2. lọc
  3. tính toán

dựa trên các thành phần trong mảng mà không cần thay đổi giá trị của chúng. Hơn nữa, ba operations trên không chỉ dùng trong lập trình hàm, chúng còn dùng để rút gọn code, làm code minh bạch hơn và ít smell hơn. Ví dụ với một bài toán đơn giản:

Cho một mảng số int ở dạng chuỗi, biến nó thành mảng số int

Dùng foreach ta sẽ có code như sau:

Nhưng với array_map thì code chỉ còn có thế này:

Ngắn gọn hơn nhiều rồi đúng không? Tiếp theo tôi sẽ giới thiệu chi tiết từng operator một.

Map của PHP – array_map

Nói một cách “hàn lâm” thì array_map trả về mảng đầu vào với các phần tử đã được xử lý qua một hàm callback. Usage:

Ta cùng tìm hiểu nó hoạt động như thế nào qua hai ví dụ thực tiễn.

Ví dụ 1:

Tạo một mảng có giá trị gấp đôi mảng int có sẵn

Dùng foreach:

Dùng array_map:

Ví dụ 2:

Ta có một mảng objects chứa điểm và tên của các sinh viên, dựa vào điểm ta cập nhật phần đánh giá học lực của sinh viên được chia làm 4 loại:
0 <= score <= 4 Loại F
4 < score <= 6 Loại D
6 < score <= 7 Loại C
7 < score < 8 Loại B
8 <= score <= 10 Loại A

Class Student:

Dữ liệu đầu vào:

Phần này tôi sẽ không viết code ví dụ bằng foreach nữa mà sẽ dùng array_map luôn:

Kết quả là các sinh viên đã được xếp loại:

Với cách code trên ta còn tận dụng được hàm setGrade để dùng lại nhiều lần. Bản thân tôi luôn cố gắng viết hàm hay class để dùng lại cho dù có mất nhiều thời gian hơn.

Từ giờ khi bạn muốn làm một tác vụ giống nhau với từng phần tử trong mảng, thay vì dùng foreach thì hãy suy nghĩ cách dùng array_map nhé. Để tìm hiểu chi tiết hơn bạn có thể tham khảo manual của array_map tại đây.

Vậy là phần 1 đã kết thúc, mời bạn đọc tiếp phần 2 để cùng tìm hiểu về array_filter.