PHP에서 어레이 키로 사용되는 숫자 문자열
다음과 같은 숫자 문자열을 사용할 수 있습니까?"123"
정수로 변환되지 않고 PHP 배열의 키로 사용할 수 있습니까?
$blah = array('123' => 1);
var_dump($blah);
인쇄하다
array(1) {
[123]=>
int(1)
}
나는 되고 싶다.
array(1) {
["123"]=>
int(1)
}
아니요, 그렇지 않습니다.
매뉴얼:
키는 정수 또는 문자열 중 하나입니다.키가 정수의 표준 표현일 경우 다음과 같이 해석됩니다(즉, "8"은 8로 해석되고 "08"은 "08"로 해석됩니다).
부록
아래의 코멘트로 인해 동작은 JavaScript 오브젝트 키와 비슷하지만 동일하지 않다고 지적하는 것이 재미있을 것 같습니다.
foo = { '10' : 'bar' };
foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!
예, 이 작업은 어레이 캐스팅을 통해 가능합니다.stdClass
오브젝트:
$data = new stdClass;
$data->{"12"} = 37;
$data = (array) $data;
var_dump( $data );
이를 통해 다음을 얻을 수 있습니다(PHP 버전 7.1까지).
array(1) {
["12"]=>
int(37)
}
(갱신:제 원래 답변은 더 복잡한 방법을 보여주었습니다.json_decode()
그리고.json_encode()
필요 없습니다.)
코멘트에 주의해 주세요.유감스럽게도 값을 직접 참조할 수 없습니다.$data['12']
알림이 표시됩니다.
업데이트:
PHP 7.2부터는 숫자 문자열을 키로 사용하여 값을 참조할 수도 있습니다.
var_dump( $data['12'] ); // int 32
회피책은 다음과 같습니다.
$id = 55;
$array = array(
" $id" => $value
);
스페이스 문자(프리펜드)는, int 변환을 보관 유지하고 있기 때문에, 적절한 솔루션입니다.
foreach( $array as $key => $value ) {
echo $key;
}
55는 int로 표시됩니다.
php 데이터 구조에서 숫자 키를 사용해야 하는 경우 개체가 작동합니다.그리고 개체는 질서를 유지하므로 반복할 수 있습니다.
$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';
키를 문자열에 입력할 수 있지만 PHP의 느슨한 타이핑으로 인해 최종적으로 정수로 변환됩니다.직접 확인:
$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);
PHP 매뉴얼:
키는 정수 또는 문자열일 수 있습니다.키가 정수의 표준 표현일 경우, 이 키는 다음과 같이 해석됩니다(즉, "8"은 8로 해석되고 "08"은 "08"로 해석됩니다).키의 플로트는 정수로 잘립니다.인덱싱된 배열 및 연관 배열 유형은 정수 및 문자열 인덱스를 모두 포함할 수 있는 PHP의 동일한 유형입니다.
문자열 키와 정수 키를 모두 가진 어레이를 병합하려고 할 때 이 문제가 발생했습니다.정수는 입력 필드의 이름(신발 크기 등)이기 때문에 스트링으로도 취급하는 것이 중요했습니다.
사용했을 때$data = array_merge($data, $extra);
PHP는 키를 '다시 정렬'합니다.순서를 매기려고 하면, 정수 키(로 시도했습니다)6
-'6'
-"6"
심지어.(string)"6"
keys)는에서 keys로 이름이 되었습니다.n
, 의 경우 은 바람직한 입니다.생각해 보면, 대부분의 경우 이것은 바람직한 행동입니다.
하려면 , 을 사용합니다.$data = $data + $extra;
pretty. ,, ^^ i i i 라고 생각했지만,.아주 간단하지만, 처음에는 ^^라고는 생각하지 않았습니다.
유효한 정수를 포함하는 문자열이 정수 형식으로 캐스팅됩니다.예: 키 "8"은 실제로 8 아래에 저장됩니다.반면, "08"은 유효한 10진 정수가 아니기 때문에 캐스팅되지 않습니다.
틀렸어
연관 배열 캐스팅을 처리하는 캐스팅 기능이 있습니다.
$array_assoc = cast($arr,'array_assoc');
$array_sequential = cast($arr,'array_sequential');
$obj = cast($arr,'object');
$json = cast($arr,'json');
function cast($var, $type){
$orig_type = gettype($var);
if($orig_type == 'string'){
if($type == 'object'){
$temp = json_decode($var);
} else if($type == 'array'){
$temp = json_decode($var, true);
}
if(isset($temp) && json_last_error() == JSON_ERROR_NONE){
return $temp;
}
}
if(@settype($var, $type)){
return $var;
}
switch( $orig_type ) {
case 'array' :
if($type == 'array_assoc'){
$obj = new stdClass;
foreach($var as $key => $value){
$obj->{$key} = $value;
}
return (array) $obj;
} else if($type == 'array_sequential'){
return array_values($var);
} else if($type == 'json'){
return json_encode($var);
}
break;
}
return null; // or trigger_error
}
회피책으로 JSON_FORCE_OBJECT 옵션을 사용하여 PHP 어레이를 json 개체로 인코딩할 수 있습니다.
즉, 다음 예시는 다음과 같습니다.
$a = array('foo','bar','baz');
echo "RESULT: ", json_encode($a, JSON_FORCE_OBJECT);
결과는 다음과 같습니다.
RESULT: {"0" : "foo", "1": "bar", "2" : "baz"}
0과 "를 모두 키로 하는 어레이에서 이 문제가 발생했습니다.즉, == 또는 ===에서 어레이 키를 확인할 수 없습니다.
$array=array(''=>'empty', '0'=>'zero', '1'=>'one');
echo "Test 1\n";
foreach ($array as $key=>$value) {
if ($key == '') { // Error - wrongly finds '0' as well
echo "$value\n";
}
}
echo "Test 2\n";
foreach ($array as $key=>$value) {
if ($key === '0') { // Error - doesn't find '0'
echo "$value\n";
}
}
이 문제를 해결하려면 어레이 키를 사용하기 전에 문자열에 다시 캐스트해야 합니다.
echo "Test 3\n";
foreach ($array as $key=>$value) {
if ((string)$key == '') { // Cast back to string - fixes problem
echo "$value\n";
}
}
echo "Test 4\n";
foreach ($array as $key=>$value) {
if ((string)$key === '0') { // Cast back to string - fixes problem
echo "$value\n";
}
}
@david 솔루션에 대해서는 관련 배열의 문자열 값에 액세스하려고 하면 숫자가 작동하지 않는다는 점에 유의하시기 바랍니다.아마 (어레이에 액세스 할 때) 뒤에 있는 정수로 캐스팅되어 값을 찾을 수 없을 것입니다.값을 정수로 액세스하는 것도 작동하지 않습니다.그러나 array_shift()를 사용하여 값을 가져오거나 배열을 반복할 수 있습니다.
$data = new stdClass;
$data->{"0"} = "Zero";
$data->{"1"} = "One";
$data->{"A"} = "A";
$data->{"B"} = "B";
$data = (array)$data;
var_dump($data);
/*
Note the key "0" is correctly saved as a string:
array(3) {
["0"]=>
string(4) "Zero"
["A"]=>
string(1) "A"
["B"]=>
string(1) "B"
}
*/
//Now let's access the associative array via the values
//given from var_dump() above:
var_dump($data["0"]); // NULL -> Expected string(1) "0"
var_dump($data[0]); // NULL (as expected)
var_dump($data["1"]); // NULL -> Expected string(1) "1"
var_dump($data[1]); // NULL (as expected)
var_dump($data["A"]); // string(1) "A" (as expected)
var_dump($data["B"]); // string(1) "B" (as expected)
정렬 키가 16진수 Sha1이어야 하는 배열을 정렬하려고 할 때 이 문제가 발생했습니다.결과 sha1 값에 문자가 없으면 PHP는 키를 정수로 변환합니다.하지만 배열은 문자열의 상대적인 순서로 정렬해야 했습니다.그래서 나는 정렬 순서를 바꾸지 않고 키를 강제로 문자열로 만들 방법을 찾아야 했다.
ASCII 차트(https://en.wikipedia.org/wiki/ASCII)를 보면 느낌표는 공백과 거의 같으며 모든 숫자 및 문자보다 확실히 낮습니다.
그래서 키 문자열 끝에 느낌표를 붙였어요.
for(...) {
$database[$sha.'!'] = array($sha,$name,$age);
}
ksort($database);
$row = reset($database);
$topsha = $row[0];
언급URL : https://stackoverflow.com/questions/4100488/a-numeric-string-as-array-key-in-php
'programing' 카테고리의 다른 글
사용자가 PHP의 localhost에 있는지 어떻게 검출할 수 있습니까? (0) | 2022.10.25 |
---|---|
MySQL 여러 행을 반환하는 SELECT 하위 쿼리를 사용하여 테이블에 삽입하려면 어떻게 해야 합니까? (0) | 2022.10.25 |
MySQL 커넥터/C++(Maria 포함)DB (0) | 2022.10.15 |
VARCHAR을 프라이머리 키로 사용할 수 있습니까? (0) | 2022.10.15 |
vue js에서 기본 날짜를 설정하는 방법 (0) | 2022.10.15 |