2013-08-10 34 views
5

NikiC nêu tại another thread:Tại sao foreach tăng số lần truy cập bằng 2 thay vì 1?

Ngay trước [a foreach] lặp các $array được "mềm sao chép" cho sử dụng trong foreach. Điều này có nghĩa rằng không có bản sao thực tế được thực hiện, nhưng chỉ có refcount của zval của $array được tăng lên 2.

Tuy nhiên, mã thử nghiệm của tôi được thể hiện một kết quả khác nhau:

$array = array(0, 1, 2); 
xdebug_debug_zval('array'); // refcount=1, is_ref=0 
          // so far so good 
foreach ($array as $key => $value) { 
    xdebug_debug_zval('array'); // refcount=3, is_ref=0 
}        // why is refcount 3 instead of 2? 

Chỉ bằng nhìn vào mã, chúng ta có thể thấy tối đa hai biến mảng.

Tại sao phải nạp lại 3?

Tại sao không nạp lại mã số 2 sau foreach?

+0

Trong vòng lặp foreach của bạn, bạn không nên tham khảo phần tử mảng của mình bằng biến $ value? – Crackertastic

+0

@Crackertastic, tôi không sử dụng bất kỳ biến nào trong vòng lặp. – Pacerier

+1

Tôi nhận được 'refcount' 2, tôi có thiếu gì đó không? 'mảng: (refcount = 2, is_ref = 0) = mảng (0 => (refcount = 1, is_ref = 0) = 0, 1 => (refcount = 1, is_ref = 0) = 1, 2 => (số lần truy cập = 2, is_ref = 0) = 2) ' – vee

Trả lời

1

xdebug_debug_zval() đang xem biến $ array chứ không phải biến $ key. nếu bạn thay đổi mã của mình thành:

foreach ($array as $key => $value) { 
    echo $key . " : " . $values . "<br>"; 
    //xdebug_debug_zval('array'); 

} 

Giá trị chính xác của mảng sẽ được trả lại. Tôi không có chức năng xdebug vì vậy tôi không thể kiểm tra giá trị bạn đưa vào đó.

+0

Tôi đã kiểm tra mã của bạn và 'xdebug_debug_zval ('mảng');' vẫn hiển thị '3' thay vì' 2'. Tôi không kiểm tra các giá trị của mảng, nhưng việc đếm ngược mảng. – Pacerier

+0

OK. Trong vòng lặp foreach, bạn sẽ cần thay đổi giá trị xdebug .... Tại thời điểm này bạn luôn luôn nhìn vào toàn bộ mảng không phải là mục trong mảng. – jeff

+0

Tôi không muốn xem mục trong mảng .... Tôi đang xem mảng vì * đó là câu hỏi này. Tại sao mảng cho refcount 3 thay vì 2? – Pacerier

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