[php] 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


답변

PHP 데이터 구조에서 숫자 키를 사용해야하는 경우 개체가 작동합니다. 객체는 순서를 유지하므로 반복 할 수 있습니다.

$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';


답변

내 해결 방법은 다음과 같습니다.

$id = 55;
$array = array(
  " $id" => $value
);

공백 문자 (앞에 추가)는 int 변환을 유지하기 때문에 좋은 솔루션입니다.

foreach( $array as $key => $value ) {
  echo $key;
}

55는 int로 표시됩니다.


답변

키를 문자열로 형변환 할 수 있지만 결국 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를 사용할 때 키를 ‘재주문’합니다. 주문을하고 시도에서, 정수 키 (I 함께 노력 6'6'"6"심지어 (string)"6"키로)에 0에서 이름이있어 n당신이 그것에 대해 생각한다면, 대부분의 경우이 원하는 동작 될 것이다 ….

$data = $data + $extra;대신 사용하여이 문제를 해결할 수 있습니다 . 꽤 솔직한데 처음 엔 생각도 못했어요 ^^.


답변

유효한 정수를 포함하는 문자열은 정수 유형으로 캐스트됩니다. 예를 들어 키 “8”은 실제로 8 아래에 저장됩니다. 반면에 “08”은 유효한 십진 정수가 아니기 때문에 캐스트되지 않습니다.

잘못된

연상 배열 캐스팅을 순차적으로 처리하는 캐스팅 기능이 있습니다.

$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
}