이상한 문자가 많은 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는 더 이상 불평하지 않습니다.
이것이 실망스러운 순간에서 다른 사람들을 구하기를 바랍니다.
답변
개인적으로 배열 키의 특이한 문자에 문제가 없었습니다. 무엇이 합법적이며 합법적이지 않은지는 잘 문서화되어 있지 않습니다. 키가 스칼라 여야한다는 것 외에는 말입니다. 가장 좋은 방법은 시도하고 보는 것입니다.