programing

PHP에서 어레이 키로 사용되는 숫자 문자열

shortcode 2022. 10. 15. 08:56
반응형

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

반응형