programing

정수나 잘못된 속성 이름과 같은 이름을 가진 개체 속성에 액세스하는 방법은 무엇입니까?

goodsources 2022. 12. 9. 21:56
반응형

정수나 잘못된 속성 이름과 같은 이름을 가진 개체 속성에 액세스하는 방법은 무엇입니까?

하고 .json_decode()예를 들어 다음과 같습니다.

$myVar = json_decode($data)

그러면 다음과 같은 출력이 나옵니다.

[highlighting] => stdClass Object
        (
            [448364] => stdClass Object
                (
                    [Data] => Array
                        (
                            [0] => Tax amount liability is ....... 

[0] 키의 문자열 값에 액세스하고 싶다.내가 다음과 같은 일을 하려고 할 때:

print $myVar->highlighting->448364->Data->0;

다음의 에러가 표시됩니다.

해석 오류: 구문 오류, 예기치 않은 T_DDNUMBER

거기에 있는 2개의 숫자/정수에 문제가 있는 것 같습니다.

PHP 7.2용으로 업데이트됨

PHP 7.2에서는 객체어레이 캐스트에서 숫자 키를 변환하는 동작 변경이 도입되었습니다.이것에 의해, 이러한 특정의 불일치가 수정되어 다음의 모든 예가 예상대로 동작합니다.

헷갈릴 일이 하나 줄었네요!


원래 답변(7.2.0 이전 버전에 적용)

PHP는 어두운 골목의 일부를 가지고 있기 때문에 당신은 정말 그 안에서 자신을 발견하고 싶지 않다.이름이 숫자인 개체 속성도 그 중 하나입니다.

그들이 당신에게 말하지 않은 것

팩트 1: 정규 변수 이름이 아닌 속성에는 쉽게 액세스할 수 없습니다.

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo; // error

팩트 #2: 이러한 속성에 액세스 할 수 있는 은, 곱슬곱슬한 괄호 구문입니다.

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!

팩트 3: 그러나 속성 이름이 모두 숫자일 경우에는 그렇지 않습니다.

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'}; // OK!
echo $o->{'123'}; // error!

실제

팩트 4: 애초에 배열에서 나온 것이 아니라면요.

$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123'; // setting property is OK

echo $o1->{'123'}; // error!
echo $o2->{'123'}; // works... WTF?

실제

꽤 직관적이죠, 그렇지 않나요?

할수있는일

옵션 #1: 수동으로 실행

가장 실용적인 방법은 관심 있는 개체를 배열로 다시 캐스팅하는 것입니다. 그러면 속성에 액세스할 수 있습니다.

$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'}; // error!
echo $a['123']; // OK!

유감스럽게도, 이것은 재귀적으로 동작하지 않습니다.그래서 당신의 경우 다음과 같은 조치를 취해야 합니다.

$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0']; // at last!

옵션 2: 핵 옵션

대체 접근법은 객체를 재귀적으로 배열로 변환하는 함수를 작성하는 것입니다.

function recursive_cast_to_array($o) {
    $a = (array)$o;
    foreach ($a as &$value) {
        if (is_object($value)) {
            $value = recursive_cast_to_array($value);
        }
    }

    return $a;
}

$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];

다만, 이 옵션은, 흥미가 없는 모든 속성을 어레이에 불필요하게 캐스트 하기 때문에, 전체적으로 좋은 옵션이라고는 생각하지 않습니다.

옵션 3: 현명한 플레이

이전 옵션 중 하나는 내장된 JSON 기능을 사용하는 것입니다.

$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];

JSON 함수는 외부 함수를 정의할 필요 없이 어레이로 재귀 변환을 수행하는 데 도움이 됩니다.아무리 바람직한 방법이라고 해도 옵션 #2의 '누크' 단점이 있습니다.또한 오브젝트 내에 스트링이 있는 경우 이들 스트링을 UTF-8로 부호화해야 한다는 단점도 있습니다(이것은 의 요건입니다.

존의 설득력 있는 설명에 왜 실패했는지 덧붙이고 싶었어요이는 모두 배열을 작성할 때 php가 키를 정수로 변환하기 때문입니다(가능한 경우). 이는 단순히 숫자 키가 유지된다는 이유만으로 객체에 캐스팅된 배열에서 조회 문제를 일으키기 때문입니다.이는 모든 속성 액세스 옵션이 문자열로 변환되거나 예상되기 때문에 문제가 됩니다.이것을 확인하려면 , 다음의 순서에 따릅니다.

$arr = array('123' => 'abc');
$obj = (object) $arr;
$obj->{'123'} = 'abc';
print_r( $obj );

출력:

stdClass Object ( 
  [123] => 'abc', 
  [123] => 'abc'
)

개체에는 두 개의 속성 키(액세스할 수 없는 숫자)와 문자열 기반)가 있습니다.의 '존'이 '존'이 '존'이 '존'이 '존'이 '존'이 '존'이'인 다.#Fact 4는 동작합니다.왜냐하면 속성을 설정하는 것은 항상 숫자가 아닌 문자열 기반의 키를 정의하는 것을 의미하기 때문입니다.

Jon의 솔루션을 사용했지만, 이 솔루션의 헤드를 돌리면 다음을 수행하여 어레이에서 항상 문자열 기반 키가 있는 개체를 생성할 수 있습니다.

$obj = json_decode(json_encode($arr));

앞으로는 다음 중 하나를 사용할 수 있습니다.이렇게 접근하면 항상 컬리 괄호 내의 값이 문자열로 변환되기 때문입니다.

$obj->{123};
$obj->{'123'};

오래되고 비논리적인 PHP...

이 음음음음 an로 @들면 다음과 같습니다.

SimpleXMLElement Object (
    [@attributes] => Array (
        [href] => qwertyuiop.html
        [id] => html21
        [media-type] => application/xhtml+xml
    )
)

다음을 사용해야 합니다.

print_r($parent_object->attributes());

$parent_object->{'@attributes'} ★★★★★★★★★★★★★★★★★」$parent_object['@attributes']작동하지 않습니다.

PHP 7의 경우

속성 이름으로 숫자가 있는 개체 속성에 액세스합니다.오브젝트에 배열을 캐스팅한 후 가장 많이 필요합니다.

    $arr = [2,3,7];
    $o = (object) $arr;

    $t = "1";
    $t2 = 1;
    $t3 = (1);

    echo $o->{1};      // 3
    echo $o->{'1'};   // 3
    echo $o->$t;        // 3
    echo $o->$t2;       // 3
    echo $o->$t3;       // 3

    echo $o->1;       // error
    echo $o->(1);      // error

저는 이 기능을 인터넷에서 복사했습니다.「stdClass 오브젝트를 다차원 어레이로 변환하는 기능」이라고 하는 표시대로 동작하는 경우는, 다음의 순서에 따릅니다.

<?php

    function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }

?>
  • first first first first your your first first first first first first first first 。objectToArray
  • 그 후 반환값을 취합니다.
  • [highlighting][448364][Data][0]

출처: PHP stdClass에서 어레이로, 어레이에서 stdClass로

Jon의 포괄적인 답변에 대한 최종 대안:

json_decode()를 사용하여 두 번째 파라미터를 true로 설정합니다.

$array = json_decode($url, true);

그러면 오브젝트가 아닌 관련 배열을 반환하므로 변환 후 변환할 필요가 없습니다.

이것은 모든 어플리케이션에 적합한 것은 아닐지 모르지만, 이 난해한 오브젝트의 속성을 쉽게 참조할 수 있도록 큰 도움이 되었습니다.

솔루션은 이 튜토리얼에 기재되어 있습니다.http://nitschinger.at/Handling-JSON-like-a-boss-in-PHP/

안부 전해요

죄송하지만 숫자로 시작하는 물체의 이름은 지정할 수 없습니다.첫 번째 이름을 문자로 시작하는 "448364"로 변경합니다.

두 번째 어레이는 다음과 같이 괄호로 접근합니다.

print myVar->highlighting->test_448364->Data[0]

대신

언급URL : https://stackoverflow.com/questions/10333016/how-to-access-object-properties-with-names-like-integers-or-invalid-property-nam

반응형