Đây là một câu hỏi lập trình đơn giản, đến từ sự thiếu hiểu biết của tôi về cách PHP xử lý sao chép mảng và unsetting trong một vòng lặp foreach
. Nó như thế này, tôi có một mảng đến từ tôi từ một nguồn bên ngoài được định dạng theo cách tôi muốn thay đổi. Một ví dụ đơn giản sẽ là:Không tắt các giá trị mảng trong khi lặp lại lưu trên bộ nhớ?
$myData = array('Key1' => array('value1', 'value2'));
Nhưng những gì tôi muốn sẽ là một cái gì đó như:
$myData = array([0] => array('MyKey' => array('Key1' => array('value1', 'value2'))));
Vì vậy, tôi lấy $myData
đầu tiên và định dạng nó như thứ hai $myData
. Tôi hoàn toàn ổn với thuật toán định dạng của tôi. Câu hỏi của tôi nằm trong việc tìm kiếm một cách để bảo tồn bộ nhớ vì các mảng này có thể hơi khó sử dụng. Vì vậy, trong vòng lặp foreach
của tôi, tôi sao chép (các) giá trị mảng hiện tại vào định dạng mới, sau đó tôi bỏ đặt giá trị mà tôi đang làm việc với từ mảng ban đầu. Ví dụ:
$formattedData = array();
foreach ($myData as $key => $val) {
// do some formatting here, copy to $reformattedVal
$formattedData[] = $reformattedVal;
unset($myData[$key]);
}
Cuộc gọi đến unset()
có phải là ý tưởng hay không? Tức là, nó bảo tồn bộ nhớ vì tôi đã sao chép dữ liệu và không còn cần giá trị ban đầu? Hoặc, không PHP tự động thu thập dữ liệu rác vì tôi không tham chiếu nó trong bất kỳ mã tiếp theo nào?
Mã chạy tốt, và cho đến nay các tập dữ liệu của tôi quá nhỏ không đáng kể để kiểm tra sự khác biệt về hiệu suất. Tôi chỉ không biết nếu tôi đang thiết lập bản thân mình cho một số lỗi lạ hoặc CPU truy cập sau này.
Cảm ơn mọi thông tin chi tiết.
-sR
Trừ khi dữ liệu của bạn là tuyệt đối lớn (một phần lớn RAM) thì bạn không lo lắng gì cả. Nếu php chạy ra một lý thuyết nó sẽ cho bạn biết, và bạn có thể tăng nó trong php.ini. – Ian
Đó là một ý tưởng ngớ ngẩn *. Bạn vừa mới giới thiệu một tác dụng phụ có thể bị lãng quên sau này đối với một số * tối ưu hóa vi *: -/Không, PHP (cũng như bất kỳ ngôn ngữ GC chuẩn nào khác mà tôi biết) có thể làm cho dữ liệu * chứa * trong một cấu trúc dữ liệu có sẵn để cải tạo trong khi tham chiếu đến * container * tồn tại (điều này loại trừ các khái niệm như tham chiếu mềm/yếu). 'Unset' có thể/sẽ làm cho PHP GC khởi động, nhưng hiệu năng thực tế đã đạt được - nếu có - do áp lực bộ nhớ phát hành không phải là tầm thường để khái quát hóa. Nếu điều này * trở thành * một vấn đề, * sau đó * giải quyết nó. –
kích thước của mảng này là bao nhiêu? –