Menu
CoddyTech

Duyệt bằng 'array_walk'

Thuộc phần Logic và luồng chương trình trong hành trình PHP của Coddy. Bài học 44 trên 68.

Hàm (function) array_walk() cung cấp một cách xử lý mảng khác với array_map(). Trong khi array_map() tạo một mảng mới với các giá trị đã biến đổi, array_walk() sửa đổi trực tiếp mảng ban đầu bằng cách áp dụng hàm callback cho từng phần tử ngay tại chỗ.

Hàm (function) này đặc biệt hữu ích khi bạn muốn thay đổi mảng hiện có mà không tạo bản sao. Hàm callback bạn cung cấp nhận từng phần tử của mảng theo tham chiếu, cho phép bạn sửa đổi trực tiếp các giá trị ban đầu.

<?php
function addPrefix(&$value, $key) {
    $value = "Item: " . $value;
}

$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items bây giờ là: ["Item: apple", "Item: banana", "Item: orange"]
?>

Hãy chú ý cách hàm callback dùng &$value để nhận phần tử mảng dưới dạng tham chiếu. Nhờ vậy, hàm có thể sửa đổi trực tiếp phần tử trong mảng gốc. Tham số thứ hai $key cho phép truy cập khóa của phần tử hiện tại, dù không phải lúc nào cũng cần đến nó khi thực hiện các phép biến đổi đơn giản.

array_walk() cũng hỗ trợ đối số thứ ba không bắt buộc, cho phép bạn truyền dữ liệu bổ sung trực tiếp vào hàm callback. Điều này hữu ích khi phép biến đổi của bạn phụ thuộc vào một giá trị được xác định bên ngoài mảng, chẳng hạn như tiền tố, hậu tố hoặc bất kỳ đầu vào động nào khác.

Khi bạn truyền đối số thứ ba cho array_walk(), hàm callback nhận đối số đó dưới dạng tham số thứ ba:

<?php
function addCategory(&$value, $key, $category) {
    $value = $category . ": " . $value;
}

$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products hiện là: ["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>

Ở đây, $prefix được truyền làm đối số thứ ba cho array_walk(), và hàm callback nhận giá trị này dưới dạng $category. Nhờ vậy, bạn có thể dùng lại cùng một hàm callback với các tiền tố khác nhau mà không cần cố định giá trị nào bên trong hàm.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận hai đầu vào: một danh sách tên sản phẩm được phân tách bằng dấu phẩy và một tiền tố danh mục. Đầu vào thứ nhất chứa tên sản phẩm dưới dạng chuỗi theo định dạng laptop,mouse,keyboard,monitor, còn đầu vào thứ hai là văn bản tiền tố danh mục (ví dụ: Electronics).

Đọc cả hai đầu vào, chuyển tên sản phẩm được phân tách bằng dấu phẩy thành một mảng, tạo một hàm callback để thêm tiền tố danh mục vào từng tên sản phẩm theo định dạng "Category: ProductName", dùng array_walk() cùng hàm callback để sửa trực tiếp mảng ban đầu, rồi in từng tên sản phẩm đã sửa trên một dòng riêng.

Hàm callback phải dùng tham số &$value để sửa các phần tử mảng theo tham chiếu. Hàm này cần nối tiền tố danh mục với dấu hai chấm và dấu cách, sau đó là tên sản phẩm.

Định dạng đầu vào:

  • Dòng thứ nhất: Tên sản phẩm được phân tách bằng dấu phẩy (ví dụ: laptop,mouse,keyboard,monitor)
  • Dòng thứ hai: Văn bản tiền tố danh mục (ví dụ: Electronics)

Đầu ra mong đợi: In từng tên sản phẩm đã sửa trên một dòng riêng theo định dạng Category: ProductName

Tự làm thử

<?php
// Đọc các tên sản phẩm được phân tách bằng dấu phẩy
$products_input = trim(fgets(STDIN));

// Đọc tiền tố danh mục
$category = trim(fgets(STDIN));

// Chuyển chuỗi (string) được phân tách bằng dấu phẩy thành mảng (array)
$products = explode(',', $products_input);

// TODO: Viết code của bạn bên dưới
// Tạo hàm (function) callback để thêm tiền tố danh mục vào từng tên sản phẩm
// Dùng array_walk() cùng hàm callback của bạn để sửa mảng


// In mỗi tên sản phẩm đã sửa trên một dòng riêng
foreach ($products as $product) {
    echo $product . "\n";
}
?>
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch PHP online