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 Show
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
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
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
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¶
trả về như đầu ra
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
đầu ra
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
Điều này mang lại đầu ra sau
Chuyện gì đang xảy ra vậy?¶
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à 9 cảnh báo 0Do đó, thay vì vòng lặp 0, tốt hơn hết là sử dụng vòng lặp 1 0Bở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¶ 1Bạ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 2Mộ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¶ 3Ở đây một mảng đột nhiên trở thành một từ điển 4Chuyệ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 5Chứ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¶ 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. 2 làm cho giá trị trả về là một mảng, thay vì một đối tượng 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 3Có khá nhiều hàm 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 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 3?Vâng, bây giờ tôi biết. Từ điển JSON 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ưuKết thúc¶
|