Các ký tự được phép trong các phím mảng php?


86

Tôi có một số khóa mảng php có rất nhiều ký tự kỳ lạ.

Điều này có được phép không? Có bất kỳ ràng buộc nào đối với những gì tôi không thể sử dụng không?


Những hạn chế:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

Câu trả lời:


90

Theo sách hướng dẫn :

Khóa có thể là một số nguyên hoặc một chuỗi. Giá trị có thể thuộc bất kỳ loại nào.

Ngoài ra, các lần nhập khóa sau sẽ xảy ra:

  • Các chuỗi chứa các số nguyên hợp lệ sẽ được chuyển sang kiểu số nguyên. Ví dụ: khóa "8" sẽ thực sự được lưu trữ dưới 8. Mặt khác, "08" sẽ không được ép kiểu, vì nó không phải là số nguyên thập phân hợp lệ.
  • Số nổi cũng được chuyển thành số nguyên, có nghĩa là phần phân số sẽ bị cắt bớt. Ví dụ: khóa 8.7 sẽ thực sự được lưu trữ dưới 8.
  • Bools cũng được chuyển thành số nguyên, tức là khóa true sẽ thực sự được lưu trữ dưới 1 và khóa false dưới 0.
  • Null sẽ được chuyển sang chuỗi trống, tức là khóa null thực sự sẽ được lưu trữ trong "".
  • Mảng và đối tượng không thể được sử dụng làm khóa. Làm như vậy sẽ dẫn đến cảnh báo: Loại bù đắp bất hợp pháp.

Hướng dẫn sử dụng lại :

Chuỗi là một chuỗi các ký tự, trong đó một ký tự giống như một byte. Điều này có nghĩa là PHP chỉ hỗ trợ bộ 256 ký tự và do đó không cung cấp hỗ trợ Unicode gốc. Xem chi tiết của loại chuỗi.

Vì vậy, trong ngắn hạn, bất kỳ chuỗi nào cũng có thể là một khóa. Và một chuỗi có thể chứa bất kỳ dữ liệu nhị phân nào (tối đa 2GB). Do đó, một khóa có thể là bất kỳ dữ liệu nhị phân nào (vì một chuỗi có thể là bất kỳ dữ liệu nhị phân nào).

Một số lạm dụng ngẫu nhiên (hợp lệ) của các khóa mảng:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
Để làm rõ, điều đó không có nghĩa là bạn không thể sử dụng chuỗi Unicode làm khóa mảng. Trên thực tế, bất kỳ chuỗi nhị phân nào cũng hoạt động tốt. Tôi thấy việc PHP tự mô tả là thiếu hỗ trợ Unicode gây khó chịu, vì nó không thực sự đúng. :)
dối trá

1
@deceze Unicode thuộc danh mục "bất kỳ dữ liệu nhị phân nào" :) (mặc dù tôi đoán với cách diễn đạt của sách hướng dẫn, tôi cho rằng cần phải làm rõ). Và nói "không cung cấp hỗ trợ Unicode tự nhiên" là đủ đúng. Có lõi PHP không bao gồm các phiên bản Unicode của strlen, substr, v.v. Mặc dù "không cung cấp xử lý gốc các chuỗi Unicode" có thể thích hợp hơn.
Corbin

3
Chắc chắn, lõi không chứa bất kỳ cơ sở nào để thao tác các chuỗi Unicode. Nhưng miễn là bạn không muốn thao tác với chuỗi, PHP hỗ trợ chúng rất tốt. Và thực tế mà nói, phần mở rộng MB có sẵn trên hầu hết mọi cài đặt PHP theo mặc định, vì vậy sự phân biệt giữa "hỗ trợ cốt lõi" hay không chủ yếu là mang tính học thuật. :)
dối trá

1
@deceze có thể ghi chú của họ nên đọc "không phải nguyên bản (xem phần mở rộng mb)" hoặc một cái gì đó sau đó. Bạn nói đúng. Bất kỳ cài đặt PHP nào kể từ năm 2005 về cơ bản đều hỗ trợ Unicode, mặc dù tôi cho rằng việc hỗ trợ Unicode trong PHP (có phần mở rộng) vẫn còn hơi khó chịu.
Corbin

@Corbin, tại sao bạn gọi đó là lạm dụng thay vì sử dụng ?
Pacerier

12

Khóa phải là một chuỗi hoặc một số nguyên. Có một số diễn biến diễn ra, nhưng tôi nghĩ sách hướng dẫn đã giải thích rất tốt:

Khóa có thể là một số nguyên hoặc một chuỗi. Giá trị có thể thuộc bất kỳ loại nào.

Ngoài ra, các lần nhập khóa sau sẽ xảy ra:

  • Các chuỗi chứa các số nguyên hợp lệ sẽ được chuyển sang kiểu số nguyên. Ví dụ: khóa "8" sẽ thực sự được lưu trữ dưới 8. Mặt khác, "08" sẽ không được ép kiểu, vì nó không phải là số nguyên thập phân hợp lệ.
  • Số nổi cũng được chuyển thành số nguyên, có nghĩa là phần phân số sẽ bị cắt bớt. Ví dụ: khóa 8.7 sẽ thực sự được lưu trữ dưới 8.
  • Bools cũng được chuyển thành số nguyên, tức là khóa true sẽ thực sự được lưu trữ dưới 1 và khóa false dưới 0.
  • Null sẽ được chuyển sang chuỗi trống, tức là khóa null thực sự sẽ được lưu trữ trong "".
  • Mảng và đối tượng không thể được sử dụng làm khóa. Làm như vậy sẽ dẫn đến cảnh báo: Loại bù đắp bất hợp pháp.

Các kiểu tài nguyên có thể được truyền thành số nguyên ngay bây giờ (không chắc đây có phải là một tính năng mới hay không), vì vậy bạn có thể sử dụng ví dụ: một trình xử lý tệp hoặc điều khiển curl làm khóa gián tiếp bằng cách truyền nó thành số nguyên và sử dụng đó làm khóa.
thomasrutter

10

Tôi tìm thấy câu trả lời này để tìm kiếm thêm thông tin về một vấn đề tôi gặp phải. Tôi đang sử dụng các chuỗi có ký tự UTF-8 trong đó, các chuỗi này sẽ không hoạt động như các khóa cho một mảng mà tôi có.

Cái gì đó như

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

Giải pháp (không lớn hay thông minh) đối với tôi là làm điều này ..

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
Tôi thích md5 () để tạo các khóa mảng. Ngay cả khi nó không hoàn toàn cần thiết vào thời điểm này, nó vẫn cảm thấy an toàn hơn.
billynoah

1
md5 () hoàn hảo để tạo khóa văn bản thuần túy từ bất kỳ chuỗi nào. An ninh không phải là vấn đề. Nó cũng tốt mà nó là nhanh chóng. Vấn đề duy nhất là liệu họ có quyết định không dùng nữa hay không, sau đó loại bỏ nó, bởi vì nó bây giờ không tốt cho những gì nó được thiết kế ban đầu. Chúng ta sẽ thấy.
Patanjali

2
Bạn có đang sử dụng phiên bản PHP cũ hơn không? Ví dụ đầu tiên của bạn hoạt động tốt trong PHP 7.1.
Elliot B.

6

Các khóa mảng trong PHP có thể là số nguyên hoặc chuỗi. Chuỗi PHP là mảng byte, có nghĩa là chuỗi các byte. Không có loại chuỗi nào khác và PHP không áp đặt bất kỳ hạn chế đặc biệt nào đối với chuỗi khóa mảng. Nói cách khác: miễn là nó là một chuỗi, bất cứ điều gì sẽ xảy ra.


Tôi nghĩ rằng việc truyền ngầm từ một chuỗi thành một khóa số nguyên là một sự khác biệt quan trọng cần thực hiện, vì một số hàm nhất định hoạt động khác nhau nếu khóa là số nguyên hay không. ví dụ: Bạn chỉ có thể sử dụng các số chuỗi tùy ý để thấy rằng một hàm mảng sau đó lập chỉ mục lại chúng từ 0..n-1.
Matthew

1
Đồng ý, nhưng tôi nghĩ nó nằm trong ranh giới của phạm vi câu hỏi này. :)
dối trá

5

Bất kỳ thứ gì bạn có thể nhồi vào một chuỗi PHP đều có thể được sử dụng làm khóa mảng. Không có giới hạn về các ký tự được phép.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

1

Nếu các khóa phức tạp đang gây ra lỗi "chỉ mục không xác định", bạn có thể gặp sự cố "cắt".

Tôi đã phát điên lên vì một khóa phức tạp tạo ra lỗi "chỉ mục không xác định" và tôi nghĩ có thể đó là vi phạm cú pháp. Khóa mảng gây ra lỗi được tạo từ một trường từ truy vấn cơ sở dữ liệu MySQL mà tôi đang chuyển đổi thành khóa và sử dụng trong một mảng mới. Chìa khóa trông như thế này: pl_1DNKoiJKwotCqAycickBVhTyvà đây là cách mã được xây dựng.

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

trên thực tế, khi nào $keyvalvà có $dbquery['fieldname']vẻ là một kết hợp hoàn hảo (được xác minh trực quan bằng cách gửi lại cả hai vào trình duyệt). Bí ẩn đã được giải quyết bằng cách sử dụng đơn giản trimtrong câu lệnh thứ hai như thế này: $keyval = trim($array_two['fieldname']);Sau khi 'cắt', php không còn phàn nàn nữa.

Hy vọng điều này sẽ cứu một số người khác khỏi một số khoảnh khắc bực bội ...


0

Cá nhân tôi không gặp bất kỳ vấn đề nào với các ký tự bất thường trong các khóa mảng. Điều gì là hợp pháp và không hợp pháp không được ghi chép đầy đủ, ngoài việc nói rằng khóa phải là một đại lượng vô hướng. Đặt cược tốt nhất của bạn là chỉ thử nó và xem.


Có một chút mâu thuẫn, có, nhưng nó đã được ghi lại đầy đủ.
Corbin

0

Ngoài tất cả các câu trả lời đều đúng: Bạn có thể sử dụng PSR vì chúng là một số loại quy tắc giữa các lập trình viên giỏi nhất để có một phong cách viết mã đẹp và chuẩn.


0

Trong mảng php, bạn không thể sử dụng khóa: 2,3 hoặc số thập phân


-1

Mã hóa trang php trong ANSI "é" sẽ có thể sử dụng (Cinéma sẽ không hiển thị dưới dạng Cinà © ma). Trong Notepad ++ chỉ cần sử dụng menu Mã hóa => Chuyển đổi ANSI và lưu


2
(Bài đăng này dường như không cung cấp câu trả lời chất lượng cho câu hỏi. Vui lòng chỉnh sửa câu trả lời của bạn hoặc chỉ đăng nó dưới dạng nhận xét cho câu hỏi).
sɐunıɔ ןɐ qɐp

Bạn có thể giải thích thêm không? Điều gì sẽ xảy ra nếu ékhông có mặt, điều gì sẽ xảy ra nếu OP không sử dụng Notepad ++?
Nico Haase,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.