Các mảng php được truyền theo tham chiếu

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ố 8

Vì, 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++

  1. 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

    $a = array(1,2,3);
    $b = $a;
    
    0
  2. 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

    $a = array(1,2,3);
    $b = $a;
    
    3
  3. 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

    $a = array(1,2,3);
    $b = $a;
    
    4
  4. 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

    
    
    0

    Tuy nhiên, bạn có thể có một tham chiếu đến một con trỏ có giá trị là

    
    
    8

  5. Con 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

  6. Một con trỏ cần được hủy đăng ký với

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    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ụng
    function 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ột
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    5

  7. 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)

  8. 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

    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    6 thuận tiện hơn khi sử dụng trong danh sách đối số, v.v.

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


2

Bạ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


3


Nhiều khung cũng cung cấp các phương pháp tương tự

  • jQuery.
    function my_func($a) {
        $a[] = 30;
    }
    
    $arr = array(10, 20);
    my_func($arr);
    var_dump($arr);
    
    9
  • dấu gạch dưới. js.
    array
      0 => int 10
      1 => int 20
    
    0 (cũng có bí danh là
    array
      0 => int 10
      1 => int 20
    
    1 và
    array
      0 => int 10
      1 => int 20
    
    2)
  • Bộ công cụ Dojo.
    array
      0 => int 10
      1 => int 20
    
    3
  • Nguyên mẫu.
    array
      0 => int 10
      1 => int 20
    
    4
  • MooTools.
    array
      0 => int 10
      1 => int 20
    
    4
  • MochiKit.
    array
      0 => int 10
      1 => int 20
    
    6
  • MS Ajax.
    array
      0 => int 10
      1 => int 20
    
    4
  • mở rộng.
    array
      0 => int 10
      1 => int 20
    
    8
  • Lodash.
    array
      0 => int 10
      1 => int 20
    
    9 (là
    function my_func(& $a) {
        $a[] = 30;
    }
    
    0 trước 4. 0. 0)
  • Ramda.
    function my_func(& $a) {
        $a[] = 30;
    }
    
    1

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

PHP có truyền mảng theo tham chiếu hoặc giá trị không?

Khi một mảng được truyền cho một phương thức hoặc hàm trong PHP, nó được truyền theo giá trị trừ khi bạn truyền nó một cách rõ ràng bằng tham chiếu , chẳng hạn như . kiểm tra hàm(&$array) { $array['new'] = 'hey';

Các mảng có tự động được chuyển qua tham chiếu không?

Thường không cần phải truyền một mảng rõ ràng bằng tham chiếu vì mảng luôn được truyền theo tham chiếu .

PHP có truyền đối tượng theo tham chiếu không?

Trong PHP, các đối tượng được truyền theo tham chiếu theo mặc định . Ở đây, tham chiếu là bí danh, cho phép hai biến khác nhau ghi vào cùng một giá trị. Một biến đối tượng không chứa chính đối tượng làm giá trị.

Làm cách nào để chuyển mảng trong PHP?

Chuyển mảng PHP sang JavaScript rất dễ dàng bằng cách sử dụng Ký hiệu đối tượng JavaScript (JSON) . Phương pháp 1. Sử dụng hàm json_encode(). Hàm json_encode() được sử dụng để trả về biểu diễn JSON của một giá trị hoặc mảng. Hàm có thể lấy cả mảng một chiều và nhiều chiều.