Vì vậy, ngày hôm qua tôi đã có một trong những cái rắm não lớn nhất trong lịch sử đầy hơi hộp sọ. Dưới đây là đoạn mã đã bốc mùi trong hộp sọ của tôi
$the_array = array[];function the_function[]{
$the_inner_array = array[
‘samplekey1',[‘sampleInnerKey’=>’SampleValue’],
‘samplekey2',[‘sampleInnerKey’=>’SampleValue’],
‘samplekey3',[‘sampleInnerKey’=>’SampleValue’]
];
foreach[$the_inner_array as $key=>$value]{
$test_array[$value[‘sampleInnerKey’]] = $value[‘SampleValue’];
}
}
the_function[];
Bây giờ điều tôi đang mong đợi từ điều này là vòng lặp foreach sẽ hoạt động theo cách của nó thông qua mảng $the_inner_array nên nó sẽ sửa đổi mảng $the_array và thêm dữ liệu vào đó. Trong C++, tôi đã sử dụng tính năng chuyển qua tham chiếu trước đây, nhưng chưa bao giờ trong PHP. Vì một số lý do [chủ yếu là do tôi thiếu kiến thức], tôi đã cố gắng chuyển dữ liệu tới mảng $the trong phạm vi toàn cầu. Sau khi tôi khắc phục sự cố này và chuyển mảng vào hàm cùng với & đến cụ thể mà tôi muốn chuyển qua tham chiếu, tôi có thể thêm dữ liệu vào $the_array và mã của tôi đã hoạt động. Đoạn mã dưới đây sẽ phù hợp với bạn trong trường hợp bạn cũng bị rắm não này. Để biết thêm thông tin về việc chuyển qua tham chiếu trong PHP, hãy xem → http. //php. net/manual/vi/ngôn ngữ. người giới thiệu. vượt qua. php
Đoạn mã trên in 1, 2, 3, 4, 5. Điều này là do mảng được truyền dưới dạng tham chiếu, nghĩa là hàm [pass_by_reference] không thao tác với bản sao của biến được truyền, mà là chính biến thực tế
Để biến một biến được truyền theo tham chiếu, nó phải được khai báo bằng dấu và [&] ở trước trong phần khai báo của hàm
1] Khi một mảng được truyền dưới dạng đối số cho một phương thức hoặc hàm, thì nó được truyền theo tham chiếu hay theo giá trị?
2] Khi gán một mảng cho một biến, biến mới có phải là tham chiếu đến mảng ban đầu không hay nó là một bản sao mới?
Làm việc này thì sao?.
$a = array[1,2,3];
$b = $a;
4 có phải là tham chiếu đến
5 không?Giải pháp tốt nhất
Đối với phần thứ hai của câu hỏi của bạn, hãy xem trang mảng của sách hướng dẫn, trong đó nêu rõ [trích dẫn]
Việc gán mảng luôn liên quan đến việc sao chép giá trị. Sử dụng toán tử tham chiếu để sao chép một mảng theo tham chiếu
Và ví dụ đã cho
Đối với phần đầu tiên, cách tốt nhất để chắc chắn là thử ;-]
Hãy xem xét ví dụ về mã này
function my_func[$a] {
$a[] = 30;
}
$arr = array[10, 20];
my_func[$arr];
var_dump[$arr];
Nó sẽ cho đầu ra này
array
0 => int 10
1 => int 20
Điều này cho biết hàm chưa sửa đổi mảng "bên ngoài" được truyền dưới dạng tham số. nó được chuyển dưới dạng bản sao và không phải là tài liệu tham khảo
Nếu bạn muốn nó được chuyển qua tham chiếu, bạn sẽ phải sửa đổi chức năng theo cách này
function my_func[& $a] {
$a[] = 30;
}
Và đầu ra sẽ trở thành
________số 8Vì, lần này, mảng đã được chuyển "theo tham chiếu"
Đừng ngần ngại đọc phần Giải thích tài liệu tham khảo của sách hướng dẫn. nó sẽ trả lời một số câu hỏi của bạn ;-]
Giải pháp liên quan
C++ – Sự khác nhau giữa biến con trỏ và biến tham chiếu trong C++
Một con trỏ có thể được gán lại
int x = 5; int y = 6; int *p; p = &x; p = &y; *p = 10; assert[x == 5]; assert[y == 10];
Một tham chiếu không thể bị ràng buộc lại và phải được ràng buộc khi khởi tạo
0$a = array[1,2,3]; $b = $a;
Một biến con trỏ có bản sắc riêng của nó. một địa chỉ bộ nhớ rõ ràng, riêng biệt có thể được lấy bằng toán tử
6 đơn nguyên và một lượng không gian nhất định có thể được đo bằng toán tử
7. Việc sử dụng các toán tử đó trên một tham chiếu sẽ trả về một giá trị tương ứng với bất kỳ tham chiếu nào được liên kết với; . Vì tham chiếu giả định danh tính của biến ban đầu theo cách này, nên sẽ thuận tiện khi coi tham chiếu như một tên khác cho cùng một biến
3$a = array[1,2,3]; $b = $a;
Bạn có thể có các con trỏ lồng vào nhau tùy ý tới các con trỏ cung cấp thêm các cấp độ định hướng. Tài liệu tham khảo chỉ cung cấp một mức độ gián tiếp
4$a = array[1,2,3]; $b = $a;
Một con trỏ có thể được gán
8, trong khi một tham chiếu phải được liên kết với một đối tượng hiện có. Nếu bạn đủ cố gắng, bạn có thể liên kết một tham chiếu tới
8, nhưng điều này không được xác định và sẽ không hoạt động nhất quán
0Tuy nhiên, bạn có thể có một tham chiếu đến một con trỏ có giá trị là
8Con trỏ có thể lặp qua một mảng; . Đây là bất kể kích thước của đối tượng mà con trỏ trỏ tới
Một con trỏ cần được hủy đăng ký với
3 để truy cập vị trí bộ nhớ mà nó trỏ tới, trong khi một tham chiếu có thể được sử dụng trực tiếp. Một con trỏ tới một lớp/cấu trúc sử dụngfunction my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
4 để truy cập các thành viên của nó trong khi một tham chiếu sử dụng mộtfunction my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
5function my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
Các tham chiếu không thể được đưa vào một mảng, trong khi các con trỏ có thể được [Được đề cập bởi người dùng @litb]
Const tài liệu tham khảo có thể được ràng buộc tạm thời. Con trỏ không thể [không phải không có một số gián tiếp]
1Điều này làm cho
6 thuận tiện hơn khi sử dụng trong danh sách đối số, v.v.function my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
Javascript – Cách kiểm tra xem một mảng có chứa giá trị hay không trong JavaScript
Các trình duyệt hiện đại có
function my_func[$a] {
$a[] = 30;
}
$arr = array[10, 20];
my_func[$arr];
var_dump[$arr];
7, thực hiện chính xác điều đó và được mọi người hỗ trợ rộng rãi ngoại trừ IE
2Bạn cũng có thể sử dụng
function my_func[$a] {
$a[] = 30;
}
$arr = array[10, 20];
my_func[$arr];
var_dump[$arr];
8, cách này ít trực tiếp hơn nhưng không yêu cầu polyfill cho các trình duyệt lỗi thời
3Nhiều khung cũng cung cấp các phương pháp tương tự
- jQuery.
9function my_func[$a] { $a[] = 30; } $arr = array[10, 20]; my_func[$arr]; var_dump[$arr];
- dấu gạch dưới. js.
0 [cũng có bí danh làarray 0 => int 10 1 => int 20
1 vàarray 0 => int 10 1 => int 20
2]array 0 => int 10 1 => int 20
- Bộ công cụ Dojo.
3array 0 => int 10 1 => int 20
- Nguyên mẫu.
4array 0 => int 10 1 => int 20
- MooTools.
4array 0 => int 10 1 => int 20
- MochiKit.
6array 0 => int 10 1 => int 20
- MS Ajax.
4array 0 => int 10 1 => int 20
- mở rộng.
8array 0 => int 10 1 => int 20
- Lodash.
9 [làarray 0 => int 10 1 => int 20
0 trước 4. 0. 0]function my_func[& $a] { $a[] = 30; }
- Ramda.
1function my_func[& $a] { $a[] = 30; }
Lưu ý rằng một số khung triển khai chức năng này dưới dạng hàm, trong khi các khung khác thêm chức năng vào nguyên mẫu mảng