2014-09-17 33 views
7

Không chắc chắn nếu điều này được coi là một lỗiThêm tài liệu tham khảo trong PHP để một mảng tạo ra một loạt các tài liệu tham khảo

$array = ['numbers' => [1, 2, 3]]; 
foreach ($array as &$numbers) { 
    $numbers = [4, 5, 6]; 
} 
var_dump($array); 
modify_array($array); 
var_dump($array); 

function modify_array($array_arg) 
{ 
    $array_arg['numbers'] = [1, 2, 3]; 
} 

Prints

array(1) { 
    ["numbers"]=> 
    &array(3) { 
    [0]=> 
    int(4) 
    [1]=> 
    int(5) 
    [2]=> 
    int(6) 
    } 
} 
array(1) { 
    ["numbers"]=> 
    &array(3) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    } 
} 

ý rằng $ mảng không được thông qua tham khảo để modify_array () tuy nhiên mảng lồng nhau đã được sửa đổi. Nghe có vẻ hợp lý nhưng không chắc chắn nếu điều này là tài liệu!

Trả lời

4

Nếu bạn đang sử dụng foreah với tham chiếu, bạn ngăn PHP sao chép mảng, vì vậy bạn đang làm việc trên mảng ban đầu. Khi bạn kết thúc vòng lặp foreach, bạn nên sử dụng biến số unset() trong vòng lặp, vì nó vẫn còn trong bộ nhớ. Nếu bạn không làm điều này, bạn sẽ nhận được kết quả không thể đoán trước như kết quả này được trình bày trong câu hỏi của bạn. Ngay cả trong documentation bạn có một cảnh báo:

Warning tham khảo của một $ value và phần tử mảng cuối cùng vẫn còn ngay cả sau khi foreach vòng lặp. Chúng tôi khuyên bạn nên hủy nó bằng cách unset().

Here bạn có thể tìm thấy các ví dụ thực sự tốt về vòng lặp foreach mà không mất cài đặt.

Vì vậy, nếu bạn thêm unset(), mọi thứ trông như nó phải

$array = ['numbers' => [1, 2, 3]]; 
foreach ($array as &$numbers) { 
    $numbers = [4, 5, 6]; 
} 
unset($numbers); 
var_dump($array); 
modify_array($array); 
var_dump($array); 

function modify_array($array_arg) { 
    $array_arg['numbers'] = [1, 2, 3]; 
} 

Kết quả:

array(1) { ["numbers"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
array(1) { ["numbers"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
+0

Chỉ muốn nói rằng nếu có ai muốn xác nhận: http: //codepad.viper-7. com/hcpoWB Điều duy nhất tôi thêm vào là dòng có thẻ br. –

+2

"Nếu bạn không làm điều này, bạn sẽ nhận được kết quả không thể đoán trước" --- điều gì cho chúng ta biết kết quả phải là * không thể đoán trước *? Cảnh báo bạn trích dẫn không giải thích được hành vi. – zerkms

+1

Tôi đồng ý, kết quả sẽ rất có thể đoán trước theo Cảnh báo, nhưng đây vẫn là một câu trả lời hữu ích bên cạnh đó. – PHPglue

0

Nếu bạn viết lại đoạn mã sau:

foreach ($array as &$numbers) { 
    $numbers = [4, 5, 6]; 
} 

Để SMTH như thế này:

$array['numbers'] = &$array['numbers']; 
    $array['numbers'] = [4,5,6]; 

Nó sẽ được dễ dàng hơn để hiểu một hành vi như vậy, và điều này dường như là một vấn đề được biết đến. (Xem: http://php.net/manual/en/language.references.php#87532)

Các vấn đề liên quan