[php] PHP 배열 키에 허용되는 문자?

이상한 문자가 많은 PHP 배열 키가 있습니다.

허용됩니까? 사용할 수없는 것에 제약이 있습니까?



답변

설명서 에 따르면 :

키는 정수 또는 문자열 일 수 있습니다. 값은 모든 유형이 될 수 있습니다.

또한 다음과 같은 키 캐스트가 발생합니다.

  • 유효한 정수를 포함하는 문자열은 정수 유형으로 캐스트됩니다. 예를 들어 키 “8”은 실제로 8 아래에 저장됩니다. 반면에 “08”은 유효한 십진 정수가 아니기 때문에 캐스트되지 않습니다.
  • 부동 소수점도 정수로 캐스트되므로 분수 부분이 잘립니다. 예를 들어 키 8.7은 실제로 8 아래에 저장됩니다.
  • 부울도 정수로 캐스트됩니다. 즉, true 키는 실제로 1 아래에 저장되고 false 키는 0 아래에 저장됩니다.
  • Null은 빈 문자열로 캐스트됩니다. 즉, null 키는 실제로 “”아래에 저장됩니다.
  • 배열과 객체는 키로 사용할 수 없습니다. 이렇게하면 경고가 발생합니다. 잘못된 오프셋 유형입니다.

다시 매뉴얼 :

문자열은 일련의 문자이며 문자는 바이트와 동일합니다. 즉, PHP는 256 자 세트 만 지원하므로 기본 유니 코드 지원을 제공하지 않습니다. 문자열 유형에 대한 세부 사항을 참조하십시오.

즉, 모든 문자열이 키가 될 수 있습니다. 그리고 문자열에는 모든 이진 데이터 (최대 2GB)가 포함될 수 있습니다. 따라서 키는 모든 이진 데이터가 될 수 있습니다 (문자열이 이진 데이터 일 수 있기 때문에).

배열 키의 임의의 (유효한) 남용 :

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


답변

키는 문자열 또는 정수 여야합니다. 발생하는 몇 가지 캐스트가 있지만 설명서가 잘 설명하고 있다고 생각합니다.

키는 정수 또는 문자열 일 수 있습니다. 값은 모든 유형이 될 수 있습니다.

또한 다음과 같은 키 캐스트가 발생합니다.

  • 유효한 정수를 포함하는 문자열은 정수 유형으로 캐스트됩니다. 예를 들어 키 “8”은 실제로 8 아래에 저장됩니다. 반면에 “08”은 유효한 십진 정수가 아니기 때문에 캐스트되지 않습니다.
  • 부동 소수점도 정수로 캐스트되므로 분수 부분이 잘립니다. 예를 들어 키 8.7은 실제로 8 아래에 저장됩니다.
  • 부울도 정수로 캐스트됩니다. 즉, true 키는 실제로 1 아래에 저장되고 false 키는 0 아래에 저장됩니다.
  • Null은 빈 문자열로 캐스트됩니다. 즉, null 키는 실제로 “”아래에 저장됩니다.
  • 배열과 객체는 키로 사용할 수 없습니다. 이렇게하면 경고가 발생합니다. 잘못된 오프셋 유형입니다.


답변

내가 가진 문제에 대한 자세한 정보를 찾고있는이 답변을 찾았습니다. 내가 가진 배열의 키로 작동하지 않는 UTF-8 문자가 포함 된 문자열을 사용하고있었습니다.

같은 것

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

저에게 (크거나 영리하지 않은) 해결책은 이것을하는 것이 었습니다 ..

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


답변

PHP 배열 키는 정수 또는 문자열 일 수 있습니다. PHP 문자열은 바이트 배열로, 바이트 시퀀스를 의미합니다. 다른 유형의 문자열은 없으며 PHP는 배열 키 문자열에 특별한 제한을 부과하지 않습니다. 즉, 문자열이면 무엇이든 진행됩니다.


답변

PHP 문자열에 넣을 수있는 것은 무엇이든 배열 키로 사용할 수 있습니다. 허용되는 문자에는 제한이 없습니다.

$a = array();

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

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


답변

복잡한 키로 인해 “정의되지 않은 인덱스”오류가 발생하는 경우 단순히 “트림”문제가있을 수 있습니다.

복잡한 키가 “정의되지 않은 인덱스”오류를 뱉어 내고 구문 위반 일 수 있다고 생각했기 때문에 나는 미쳐 버렸다. 오류를 일으키는 배열 키는 내가 키로 변환하고 새 배열에서 사용하는 MySQL 데이터베이스 쿼리의 필드에서 빌드되었습니다. 키는 다음과 같았습니다. pl_1DNKoiJKwotCqAycickBVhTy여기에 코드가 생성 된 방법이 있습니다.

//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];

사실, 때 $keyval$dbquery['fieldname']완벽하게 일치하는 것으로 나타났다 (시각 브라우저에 모두 반향에 의해 확인). 수수께끼는 trim두 번째 문장에서 다음과 같이 간단히 해결되었습니다 : $keyval = trim($array_two['fieldname']);일단 ‘트리밍’되면, PHP는 더 이상 불평하지 않습니다.

이것이 실망스러운 순간에서 다른 사람들을 구하기를 바랍니다.


답변

개인적으로 배열 키의 특이한 문자에 문제가 없었습니다. 무엇이 합법적이며 합법적이지 않은지는 잘 문서화되어 있지 않습니다. 키가 스칼라 여야한다는 것 외에는 말입니다. 가장 좋은 방법은 시도하고 보는 것입니다.