PHP-이 잘못된 오프셋 유형 오류를 어떻게 수정합니까?


90

나는 얻고있다

잘못된 오프셋 유형

이 코드를 반복 할 때마다 오류가 발생합니다. 코드는 다음과 같습니다.

$s = array();
for($i = 0; $i < 20; $i++){
    $source = $xml->entry[$i]->source;
    $s[$source] += 1;    
}

print_r($s)

10
경고 : 거의 모든 답변 (좀뱃 제외) $sourceSimpleXML해당 특정 상황에만 적용되는 정보를 제공 하는 인스턴스 라고 가정합니다 . 결국 그것이 사실 이었지만, 질문은 그것을 언급하지 않았으며 참조를 위해 여기에 오는 사람은 이것을 고려해야합니다.
Álvaro González

답변:


157

개체 또는 배열을 사용하여 배열 인덱스에 액세스하려고하면 잘못된 오프셋 유형 오류가 발생 합니다. 을 인덱스 키로 합니다.

예:

$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type

귀하의 $xml배열에서 객체 나 배열을 포함 $xml->entry[$i]->source일부 값에 대해 $i, 당신은에 대한 인덱스 키로 그것을 사용하려고하면 $s, 당신은 경고를 얻을. $xml원하는 내용이 포함되어 있고 올바르게 액세스하고 있는지 확인해야 합니다.


소스에 html이 포함되어 있습니다. 해당 클래스가 객체로 사용됩니까?
Steven

$xml일종의 XML 파서를 사용 하여 변수를 만들었습니까 ? simple_xml 또는 DOMDocument? 이 경우 소스 노드는 실제로 일종의 dom 요소 객체 일 가능성이 높습니다.
zombat

나는 simplexml_load_string을 사용하고 있습니다. 도움이 되나요?
Steven

HTML이 XML로 구문 분석되었을 수 있으며 모든 태그가 노드가 될 수 있습니다. 예를 들어 소스 속성으로 "<div> Hi </ div>"의 HTML 스 니펫이있는 경우 $xml->entry[$i]->source->div. HTML을 DOM 구조로 구문 분석하려면 SimpleXML보다 HTML을 훨씬 잘 처리 DomDocument하는 loadHTML()기능이 있습니다. php.net/manual/en/domdocument.loadhtml.php
zombat

감사합니다. str_replace를 사용하여 html을 제거했는데 작동합니다.
Steven

26

trim($source)전에 사용하십시오 $s[$source].


3
나는이되지,이 질문에 대한 정답이라고 생각 zombat의
Pmpr

5
객체를 트리밍하는 것은 객체를 문자열로 캐스트하는 분명하지 않은 방법 일 뿐이며 (간단한 방법은 (string)$source) 결과는 전적으로 __toString () 구현 에 따라 다릅니다 . SimpleXML객체 가 있으면 작동 합니다 (모든 사람이 분명히 가정하지만 질문에 실제로 언급되지 않은 것).
Álvaro González

이것이 문제가 __toString () 구현과 관련된 경우 trim () 호출은 깨끗한 솔루션이 아닙니다. 그건 헷갈 린다.
Čamo

3

$ xml-> entry [$ i]가 존재하고 속성을 가져 오기 전에 객체인지 확인하십시오.

 if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
   $source = $xml->entry[$i]->source;          
   $s[$source] += 1;
 }

또는 $ source는 유효한 배열 오프셋이 아니라 배열, 개체, 리소스 또는 null 일 수 있습니다.


2
유일한 정답입니다. 배열에있는 요소의 존재를 확인해야합니다. 존재하지 않으면 속성에 액세스 할 수 없습니다.
RWC

0

XML에 20 개 미만의 항목이있을 수 있습니다.

이 코드를 변경

for ($i=0;$i< sizeof($xml->entry); $i++)
...

4
정의되지 않은 정수 인덱스는 "잘못된 오프셋"경고를 생성하지 않으며 대신 "정의되지 않은 인덱스"E_NOTICE가 표시됩니다.
zombat

0

비슷한 문제가있었습니다. XML 자식에서 문자를 얻었을 때 먼저 문자열 (또는 예상하는 경우 정수)로 변환해야했습니다. 다음은 문제를 해결 한 방법을 보여줍니다.

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.