Mảng có thể thay đổi trong php không?

Một trong những kiểu dữ liệu cốt lõi trong PHP là mảng. Hầu như không thay đổi kể từ khi bắt đầu ngôn ngữ. Cái tên "mảng" hơi đáng tiếc, cũng như cách triển khai. Nó không thực sự là một mảng

Trên thực tế, đó là một kiểu kết hợp Frankenstein giữa danh sách và từ điển, được biết đến từ các ngôn ngữ khác. Điều này khá khó hiểu và có thể gây ra những hiệu ứng bất ngờ và đôi khi khó chịu. Đôi khi, nó phá vỡ mọi thứ. Điều đó đã xảy ra với tôi tuần trước. Thêm về điều đó sau

Trước tiên, để hiểu rõ mọi thứ, hãy nói về sự khác biệt giữa danh sách và từ điển

Danh sách¶

Một danh sách, đôi khi còn được gọi là một mảng, giống như tên gợi ý, một danh sách các phần tử thuộc bất kỳ loại nào. Các phần tử này được sắp xếp theo thứ tự và mọi phần tử đều có chỉ mục số, bắt đầu bằng 0

Ví dụ trong Javascript

let myList = [2, 1, 'foo', new Date[]];
let myElem = myList[2]; // myElem contains 'foo'

Từ điển¶

Trong Python, nó được gọi là từ điển, Perl và Ruby gọi nó là hàm băm, trong Javascript/JSON, nó được gọi là đối tượng. Điều này cũng khá khó hiểu nhưng đó là lúc khác

Dù tên nó là gì, từ điển là tập hợp các cặp khóa/giá trị. Các cặp khóa/giá trị đó không nhất thiết phải có thứ tự cố định. Các khóa là các chuỗi, các giá trị có thể là bất kỳ thứ gì. Và mỗi phím là duy nhất

Một ví dụ trong Python

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}

Mảng "Frankenstein" của PHP¶

Ngày xửa ngày xưa, những người tạo ra PHP nghĩ rằng sẽ là một Ý tưởng hay khi hợp nhất các danh sách và từ điển thành một kiểu dữ liệu, để làm cho mọi thứ trở nên tồi tệ hơn, họ đặt tên là "mảng". Với các tác dụng sau

  • các phần tử trong một mảng PHP luôn được sắp xếp theo thứ tự
  • các phần tử trong mảng PHP có thể có khóa dựa trên chuỗi hoặc chỉ mục số
  • các chỉ mục số này có thể liên tiếp [cảnh báo spoiler. điều này là cần thiết. ]

Hmmm, tôi tự hỏi nếu điều đó có thể dẫn đến vấn đề. Hãy xem cách nó hoạt động

Danh sách trong PHP¶

$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];

trả về như đầu ra

Array
[
    [0] => element 1
    [1] => element 2
    [2] => element 3
]
element 2

Trông trực quan, điều này hoạt động giống như trong nhiều ngôn ngữ khác. Tất cả các phần tử được gán một chỉ mục số liên tiếp, theo đó chúng có thể được truy cập

Từ điển trong PHP¶

Với các cặp khóa/giá trị, nó cũng hoạt động theo cách bạn mong đợi

$myArray = [
    'foo' => 'bar',
    'boo' => 'baz',
];
print_r[$myArray];
print_r[$myArray['boo']];

đầu ra

Array
[
    [foo] => bar
    [boo] => baz
]
baz

Vì các khóa được xác định rõ ràng nên không có chỉ mục số được gán tự động

Danh sách hay từ điển?¶

Sẽ khó hiểu hơn một chút nếu chúng ta kết hợp danh sách và từ điển, điều này hoàn toàn ổn trong PHP

$myArray = [
    'foo' => 'bar',
    'blarp',
    4 => 'elem with numeric index',
    2 => 'another elem with lower numeric index',
    'boo' => 'baz',
];

// add an element to the end of the array
$myArray[] = 'zonk';
print_r[$myArray];
$myArray[3] = 'three';
print_r[$myArray];

Điều này mang lại đầu ra sau

Array
[
    [foo] => bar
    [0] => blarp
    [4] => elem with numeric index
    [2] => another elem with lower numeric index
    [boo] => baz
    [5] => zonk
]
Array
[
    [foo] => bar
    [0] => blarp
    [4] => elem with numeric index
    [2] => another elem with lower numeric index
    [boo] => baz
    [5] => zonk
    [3] => three
]

Chuyện gì đang xảy ra vậy?¶

  • nếu không có khóa rõ ràng nào được xác định, một khóa số sẽ được gán tự động bởi PHP
  • phím đó sẽ là phím số cao nhất + 1 hoặc 0 nếu không có
  • vị trí của từng phần tử không phụ thuộc vào phím số

Lặp qua mảng¶

Vì PHP không nhất thiết phải có các khóa số liên tiếp, nên không phải lúc nào cũng có thể lặp lại chúng theo cách này

________số 8

Điều này sẽ đưa ra hành vi không mong muốn với mảng ở trên và

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
9 cảnh báo

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
0

Do đó, thay vì vòng lặp

$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
0, tốt hơn hết là sử dụng vòng lặp
$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
1

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
0

Bởi vì điều đó sẽ luôn hoạt động như mong đợi

Vì vậy, mọi thứ đều ổn sau đó?

Không. Thế giới rộng lớn hơn PHP một mình. Rất thường xuyên, bạn cần trao đổi dữ liệu với các ngôn ngữ hoặc ứng dụng khác. Điều này rất thường được thực hiện bằng cách sử dụng JSON. Và sau đó nó có thể là một vấn đề

Chuyển đổi JSON¶

JSON đã trở thành tiêu chuẩn thực tế để trao đổi dữ liệu giữa các ứng dụng và máy chủ. Mọi ngôn ngữ lập trình đều có chức năng giải mã chuỗi JSON thành định dạng nội bộ và ngược lại, để mã hóa dữ liệu nội bộ thành chuỗi JSON

Đối với những chuyển đổi đó, điều cần thiết là chúng hoạt động đối xứng, nói cách khác. nếu bạn chuyển đổi dữ liệu thành JSON và ngược lại, nó vẫn sẽ là dữ liệu không thay đổi

Với một ngôn ngữ mà mảng có thể vừa là danh sách vừa là từ điển, điều này sẽ gây ra một số vấn đề

Từ điển biến thành danh sách¶

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
1

Bạn sẽ mong đợi chuỗi JSON ban đầu không thay đổi, nhưng trên thực tế, bạn nhận được một thứ khác

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
2

Một từ điển đột nhiên biến thành một danh sách. Điều đó có nghĩa là chuyển đổi không đối xứng

Nó cũng xảy ra theo cách khác xung quanh

Biến mảng thành từ điển¶

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
3

Ở đây một mảng đột nhiên trở thành một từ điển

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
4

Chuyện gì đang xảy ra ở đây?

Các phím số liên tiếp¶

Một mảng trong PHP là một danh sách nếu nó có các khóa số liên tiếp, bắt đầu bằng 0. Nếu bạn chuyển đổi nó thành JSON, nó cũng sẽ trở thành một danh sách

Trong tất cả các trường hợp khác, nó thực sự là một từ điển và nó sẽ được chuyển đổi thành một đối tượng JSON

PHP8. 1 để giải cứu?¶

Cho đến gần đây, không có chức năng riêng biệt nào để kiểm tra xem một mảng có phải là danh sách hay không. Nhưng, giờ đây với PHP8. 1 cuối cùng là hàm array_is_list. Muộn còn hơn không, amirite?

Nhưng nếu bạn sử dụng phiên bản PHP cũ hơn, bạn có thể mô phỏng nó bằng polyfill này

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
5

Chức năng này đôi khi có thể hữu ích, nhưng nó không phải là giải pháp cho mọi thứ. Nó không thể ngăn tôi rơi vào hố từ ví dụ trên, dựa trên Sự kiện có thật

Tôi đã rơi xuống hố như thế nào¶

myDict = {'foo': 'bar', 'boo': 'baz'}
myElem = myDict['foo']  # myElem contains 'bar'
myDict['boo'] = 'bla'
print[myDict]  # output: {'foo': 'bar', 'boo': 'bla'}
1

Đoạn JSON ở trên là một phần của tài liệu JSON lớn hơn nhiều, ở đâu đó trong cơ sở dữ liệu. Tôi cần giải mã nó thành PHP để có thể làm việc với nó;

Lưu ý đối số thứ hai cho json_decode.

$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
2 làm cho giá trị trả về là một mảng, thay vì một đối tượng
$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
3. Hầu hết thời gian tôi làm như vậy, bởi vì các mảng nói chung dễ làm việc hơn nhiều so với các đối tượng
$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
3

Có khá nhiều hàm

$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
5, nhưng hầu như không có gì liên quan đến các đối tượng. Ví dụ, nếu bạn muốn hợp nhất hai đối tượng, cách dễ nhất là truyền chúng thành mảng, ném chúng qua
$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
6 amd sau đó truyền lại cho các đối tượng nếu cần. Vậy tại sao thậm chí sử dụng các đối tượng
$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
3?

Vâng, bây giờ tôi biết. Từ điển JSON

$myArray = [
    'element 1',
    'element 2',
    'element 3',
];
print_r[$myArray];
print_r[$myArray[1]];
8 có các phím số liên tiếp. Vâng, chúng là các chuỗi, nhưng này, đây là PHP. Chúng được âm thầm chuyển thành số nguyên. Vì vậy, từ điển đã thay đổi thành một mảng giống như danh sách PHP, và sau đó trong danh sách JSON. Làm cho một hình thức ở đâu đó bị phá vỡ. Cảm ơn chúa vì đã sao lưu

Kết thúc¶

  • Mảng có thể lừa đảo trong PHP

  • Chúng có thể "hoạt động như" một danh sách hoặc một từ điển. Hầu hết thời gian bạn không thực sự nhận thấy điều này cho đến khi bạn chuyển đổi chúng sang định dạng như JSON

  • Nếu bạn đang giải mã JSON mà bạn cần mã hóa lại thành JSON, bạn nên giải mã thành một đối tượng chứ không phải một mảng

    Các mảng có bất biến trong PHP không?

    Mảng bất biến là một khái niệm được thêm vào PHP 7 và là một phần của tiện ích mở rộng OPCache mà tôi cho rằng bạn đang sử dụng. Một mảng không thay đổi là một mảng chứa đầy các phần tử không thay đổi, là các giá trị đã biết và được giải quyết đầy đủ tại thời điểm biên dịch. chuỗi, số nguyên, số float hoặc mảng chứa những.

    Mảng PHP là tĩnh hay động?

    Có, mảng PHP là mảng động , theo nghĩa là người ta có thể tạo mảng, chèn phần tử mới, xóa phần tử, v.v. mà không bao giờ lo lắng về kích thước của nó. Mảng tự động phát triển hoặc thu nhỏ khi cần.

    Loại mảng nào là PHP?

    Trong PHP, có ba loại mảng. Mảng có chỉ số - Mảng có chỉ số là số. Mảng kết hợp - Mảng có khóa được đặt tên. Mảng nhiều chiều - Mảng chứa một hoặc nhiều mảng.

    Mảng có phải là kiểu dữ liệu trong PHP không?

    Mảng PHP. Mảng là kiểu dữ liệu phức hợp . Nó có thể lưu trữ nhiều giá trị của cùng một kiểu dữ liệu trong một biến duy nhất.

Chủ Đề