Có thể bạn đang sử dụng mảng hàng ngày với tư cách là nhà phát triển PHP, vì đây là kiểu cấu trúc dữ liệu tập hợp mặc định trong PHP. Điều bạn có thể không biết là PHP cung cấp rất nhiều hàm thao tác mảng tích hợp, chúng hiệu quả hơn so với giải pháp vùng đất của người dùng, bởi vì chúng được tích hợp vào lõi và được thiết kế để xử lý hầu hết các trường hợp cạnh
Trong loạt bài hướng dẫn này, chúng ta sẽ tìm hiểu một số hàm mảng có sẵn. Hiển thị các trường hợp sử dụng có thể có của họ một cách toàn diện nhất có thể. Hy vọng loạt bài này sẽ cải thiện cách bạn xử lý mảng PHP và làm cho mã của bạn tốt hơn
Trong toàn bộ loạt bài, chúng tôi sẽ hoạt động trên một mảng có tên là $books
$books = [
'Head First Design Patterns',
'Design Patterns: Elements of Reusable Object-Oriented Software',
'Agile Software Development, Principles, Patterns, and Practices',
'Patterns of Enterprise Application Architecture',
];
#array_map & array_walk
Khi chúng ta cần một định dạng mới của một mảng hiện có, chúng ta có thể định dạng lại nó bằng một vòng lặp
Ví dụ: để tạo định dạng mới của $books như hình bên dưới
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
Chúng ta có thể làm điều đó bằng tay
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
Hàm mảng PHP tích hợp Array_map cho phép chúng ta áp dụng gọi lại cho từng phần tử của một mảng
Để hoàn thành nhiệm vụ tương tự ở trên, chúng ta có thể làm
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
PHP cung cấp một hàm mảng khác là array_walk, hoạt động tương tự như array_map
Để hoàn thành nhiệm vụ tương tự ở trên với array_walk, chúng ta có thể làm
array_walk[$books, function [&$value, $key] {
return $value = ['name' => $value];
}];
Một vài điểm khác biệt chính mà chúng ta có thể thấy giữa array_map và array_walk
- Mảng đầu vào được chuyển đến array_walk theo tham chiếu, trong khi đó là các giá trị với array_map
- Cuộc gọi lại trong array_walk chấp nhận cả khóa và giá trị mảng, trong khi trong array_map, nó chỉ chấp nhận giá trị mảng
#Bí quyết, Thuật, mẹo
Chức năng array_map không cung cấp bất kỳ cách nào để chuyển mảng KEY cho chức năng gọi lại. Tuy nhiên, nó cho phép chúng ta truyền vào nhiều tham số
Một thủ thuật hay để cho phép chúng tôi chuyển cả giá trị và khóa cho hàm gọi lại
array_map[function [$value, $key] {
}, $array, array_keys[$array]];
#array_reduce
Khi chúng ta muốn duyệt qua một mảng, hãy thực hiện một số logic và trả về một giá trị duy nhất ở cuối. Thông thường chúng ta sẽ làm điều đó thông qua một câu lệnh lặp
Ví dụ: để đếm tổng số ký tự trong mảng $books. Chúng ta có thể làm với một vòng lặp như hình bên dưới
$totalChars = 0;
foreach [$books as $book] {
$totalChars += strlen[$book];
}
PHP đi kèm với hàm mảng tích hợp Array_reduce. Nó cho phép chúng ta giảm lặp đi lặp lại mảng thành một giá trị bằng cách sử dụng hàm gọi lại
Để hoàn thành nhiệm vụ tương tự ở trên, chúng ta có thể làm
?
$total = array_reduce[$books, function [$totalChars, $current] {
return $totalChars += strlen[$current];
}, 0]
#chữ ký chức năng
Chữ ký của array_reduce đáng nói ở đây
________số 8Tham số đầu tiên $array là nơi chúng tôi cung cấp mảng đầu vào
Tham số thứ hai $callback cung cấp chữ ký hàm sau
callback [ mixed $carry , mixed $item ]
$carry mang giá trị của lần lặp trước
$item giữ giá trị hiện tại
Tham số tùy chọn thứ ba, có giá trị mặc định là NULL, cho phép chúng ta đặt giá trị bắt đầu. Trong trường hợp của chúng tôi, chúng tôi đặt nó thành 0, vì giá trị ban đầu của tổng số ký tự phải bằng không
#array_pop
Khi chúng ta cần trích xuất giá trị cuối cùng của một mảng, thông thường chúng ta sẽ làm
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
0Một điều chúng ta cần lưu ý ở đây
- Mảng $books có thể trống tùy thuộc vào vị trí của nó, vì vậy chúng ta cần xác thực nó trước khi trích xuất phần tử cuối cùng, nếu không, chúng ta sẽ nhận được loại lỗi nghiêm trọng "không tìm thấy chỉ mục", về cơ bản sẽ chấm dứt quá trình thực thi mã hiện tại
Chúng tôi có thể kết thúc với một cái gì đó tương tự như hình dưới đây
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
1Hàm mảng PHP tích hợp cho trường hợp sử dụng như vậy là array_pop. Để trích xuất giá trị cuối cùng của $books, chúng ta chỉ cần làm
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
2Bên cạnh việc cải thiện hiệu suất của nó, chức năng này tự xử lý trường hợp cạnh mảng trống. Khi mảng trống, nó trả về giá trị NULL có thể dự đoán được
#thận trọng
Một lưu ý khi sử dụng chức năng này. Tham số được truyền bằng cách tham chiếu đến chức năng này. Nó sẽ thay đổi mảng được cung cấp bên cạnh việc trả về giá trị cuối cùng
Tác dụng phụ này có thể được chứng minh như hình dưới đây
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
3Kết quả chạy tập lệnh trên
?
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
4#array_shift
Khi cần trích xuất giá trị đầu tiên của một mảng, thông thường chúng ta sẽ thực hiện
$firstBook = $books[0];
Một điều chúng ta cần lưu ý ở đây
- Mảng $books có thể trống tùy thuộc vào vị trí của nó. Chúng ta cần xác thực nó trước khi trích xuất phần tử đầu tiên. Nếu không, chúng tôi sẽ gặp loại lỗi nghiêm trọng "không tìm thấy chỉ mục", về cơ bản sẽ chấm dứt việc thực thi mã hiện tại
Chúng tôi có thể kết thúc với một cái gì đó tương tự như hình dưới đây
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
5Hàm mảng PHP tích hợp cho trường hợp sử dụng như vậy là array_shift. Để trích xuất giá trị đầu tiên của $books, chúng ta chỉ cần làm
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
6Bên cạnh việc cải thiện hiệu suất của nó, chức năng này tự xử lý trường hợp cạnh mảng trống. Khi mảng trống, nó trả về giá trị NULL có thể dự đoán được
#thận trọng
Một lưu ý khi sử dụng chức năng này. Tham số được truyền bằng cách tham chiếu đến hàm này như hàm array_pop. Nó sẽ thay đổi mảng được cung cấp bên cạnh việc trả về giá trị cuối cùng
Tác dụng phụ này có thể được chứng minh như hình dưới đây
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
3Kết quả chạy tập lệnh trên
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
8#array_push
Khi chúng ta cần thêm nhiều phần tử vào một mảng hiện có, thông thường chúng ta sẽ làm. xa lạ
[
[
'name' => 'Head First Design Patterns',
],
[
'name' => 'Design Patterns: Elements of Reusable Object-Oriented Software',
],
[
'name' => 'Agile Software Development, Principles, Patterns, and Practices',
],
[
'name' => 'Patterns of Enterprise Application Architecture',
],
]
9Hàm mảng PHP tích hợp Array_push có thể làm cho điều này trở nên thanh lịch hơn. Để thêm nhiều phần tử vào cuối $books, chúng ta chỉ cần làm
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
0#thận trọng
Chúng ta cần phải rất rõ ràng về các tham số và giá trị trả về của hàm này. Nó có thể gây nhầm lẫn nếu bạn không hiểu rõ về chúng
- Tham số đầu tiên, mảng để thêm phần tử vào, được truyền theo tham chiếu
- Giá trị trả về của hàm này là số phần tử mới trong mảng. Hãy ghi nhớ, nó không phải là mảng kết quả với các yếu tố mới
Để hiển thị các điểm trên bằng mẫu mã
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
1Kết quả của việc chạy tập lệnh trên
?
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
2#array_unshift
Khi chúng ta cần thêm một hoặc nhiều phần tử vào một mảng hiện có, thông thường chúng ta sẽ thực hiện với một vòng lặp
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
3Hàm mảng PHP tích hợp Array_unshift cung cấp giải pháp dễ sử dụng. Để thêm các phần tử trả trước $books, chúng ta chỉ cần làm
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
4#thận trọng
Giống như array_push, chúng ta cần hiểu rất rõ ràng về các tham số và giá trị trả về của hàm này
- Tham số đầu tiên, mảng để thêm các phần tử vào, được truyền theo tham chiếu
- Giá trị trả về của hàm này là số phần tử mới trong mảng. Nó không phải là mảng kết quả với các phần tử mới
Để hiển thị các điểm trên bằng mẫu mã
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
5Kết quả của việc chạy tập lệnh trên
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
6#array_slice
Khi chúng ta cần trích xuất một phần của mảng hiện có và gán giá trị của nó cho một mảng mới khác. Chúng tôi sẽ làm thông thường
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
7Hàm mảng PHP tích hợp Array_slice cung cấp một giải pháp dễ sử dụng. Để trích xuất một phần của $books, chúng ta chỉ cần làm
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
8#array_merge
Khi chúng ta cần hợp nhất hai mảng thành một. Chúng ta có thể làm thủ công với các vòng lặp
$booksNew = [];
foreach [$books as $book] {
$booksNew[] = [
'name' => $book
];
}
9Hàm mảng PHP tích hợp Array_merge cung cấp một cách thanh lịch. Để hợp nhất $otherBooks với $books, chúng ta chỉ cần làm
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
0#thận trọng
Nếu các mảng đầu vào có các khóa chuỗi giống nhau, thì giá trị sau của khóa đó sẽ ghi đè lên giá trị trước đó. Tuy nhiên, nếu mảng chứa các phím số, các giá trị sau sẽ được thêm vào mảng đầu tiên
Chúng ta có thể chứng minh điểm này như hình dưới đây
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
1Kết quả của việc chạy tập lệnh trên
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
2#Một trường hợp sử dụng phổ biến
Hàm array_merge thường được sử dụng để cung cấp một số cài đặt mặc định nhưng vẫn cho phép người dùng ghi đè lên chúng
Ví dụ
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
3#array_sum
Khi chúng ta cần lấy tổng của một mảng các giá trị số. Chúng ta có thể làm thủ công với vòng lặp
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
4Hàm mảng PHP tích hợp Array_sum cung cấp giải pháp vượt trội. Để tổng hợp các giá trị của $numbers, chúng ta chỉ cần làm
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
5#thận trọng
Điều gì xảy ra nếu tham số mảng được cung cấp không chứa các giá trị số?
array_sum sẽ chỉ trả về 0 như hình bên dưới
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
6Kết quả của việc chạy tập lệnh trên.
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
9#array_filter
Khi cần lọc các phần tử của mảng thông thường chúng ta sẽ xử lý bằng các câu lệnh lặp
Ví dụ: để xóa tất cả sách chứa chuỗi "Thiết kế" khỏi mảng $books, chúng ta có thể thực hiện
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
7Hàm mảng PHP tích hợp Array_filter cung cấp giải pháp với cú pháp tao nhã
Để hoàn thành nhiệm vụ tương tự với array_filter, chúng ta có thể làm
$booksNew = array_map[function [$item] {
return ['name' => $item];
}, $books];
8#lập trình chức năng
Hàm array_filter chấp nhận một bao đóng làm tham số thứ hai của nó và trả về một mảng mới. Điều này đôi khi được gọi là lập trình chức năng
Lập trình hàm là một mô hình lập trình mạnh mẽ. Và nó làm cho mã của chúng tôi dễ hiểu khi được sử dụng đúng cách