잘못된 문자열 오프셋 경고 PHP


193

PHP 버전을 5.4.0-3으로 업데이트 한 후 이상한 PHP 오류가 발생합니다.

이 배열이 있습니다.

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

이와 같이 액세스하려고하면 이상한 경고가 나타납니다.

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

php.ini를 편집하고 오류 수준을 다시 설정하고 싶지 않습니다.


20
분명히 $memcachedConfig그 배열이 아닙니다. 표시var_dump($memcachedConfig);
zerkms

1
키가 존재하지 않음을 의미합니다. var_export($memcachedConfig)"인쇄"직전에 변수를 확인하십시오 .
Skrol29

9
대부분의 사람들이 놓친 것은 이것이 인덱스가 존재하지 않는다는 것을 의미하지는 않습니다. "정의되지 않은 인덱스"메시지를 생성합니다. 이것은 다른 오류입니다.
grantwparks

5
stackoverflow.com/a/20271518/2898712 가 여기에 정답입니다.
wedi

19
이 질문을 보는 사람에게주의하십시오 :이 질문에 대한 정답은 표시된 것이 아닙니다 . Kzqai가 맞습니다
Aaron

답변:


37

이 방법으로 시도하십시오 ....이 코드를 테스트했습니다 .... 작동합니다 ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);

1
그것을 발견. 당신의 도움을 주셔서 감사합니다. var_dump가 도움이되었습니다. 구성 파일에서 배열을로드 했으며이 구성 파일은 다음과 같습니다. array (2) {[ "host"] => string (9) "127.0.0.1"[ "port"] => string (5) "11211"} string (5) "m_prefix"PHP 5.4 이제 $ xx [ ' host ']는 경고를 올바르게 던졌습니다.
thesonix

후에도 같은 오류가 발생했습니다 include_once($file);. 배열은 올바르게 빌드되었지만 (디버그 정보에 표시됨) PHP 잘못된 stringoffset 경고 메시지없이 사용하기 전에 다른 배열로 수동으로 복사해야했습니다.
Franz Holzinger

$ sStartDate = 날짜 ( "Ymd", strtotime ($ feed [ 'DTSTART'] [ '값'])); $ sEndDate = 날짜 ( "Ymd", strtotime ($ feed [ 'DTEND'] [ '값'])); 여기서 동일한 오류를 수정하는 방법 경고 : 잘못된 문자열 오프셋
J. Shabu

303

오류는 Illegal string offset 'whatever' in...일반적으로 문자열을 전체 배열로 사용하려고한다는 것을 의미합니다.

실제로 문자열은 PHP에서 단일 문자의 배열로 취급 될 수 있기 때문에 가능합니다. 따라서 $ var은 키가있는 배열이지만 표준 숫자 키가 있는 문자열 일뿐입니다 .

$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error

http://ideone.com/fMhmkR 에서 실제로 볼 수 있습니다

이 질문에 온 사람들은 내가 그랬던 것처럼 오류의 모호함을 그것에 대해 할 수있는 것으로 바꾸려고합니다.


8
이것이 원래 문제가 발생한 이유임을 알 수 있습니다. 대부분의 의견은 "정의되지 않은 색인"이 오류라고 잘못 가정합니다.
grantwparks

1
while 루프에서이 문제가 발생했습니다. 감사합니다
David Okwii 2016 년

다차원 배열의 잘못된 노드를 잡으려고 시도 할 때 (예 : "너무 깊게")이 오류가 발생할 수 있습니다. 대신 선택의 부모가 필요합니다.
zoltar

이것은 정확 합니다. fetchAll(PDO::FETCH_ASSOC)대신 사용 fetch(PDO::FETCH_ASSOC)하고 완벽하게 작동했습니다.
MNN

실수로 $variablename = [];코드의 다른 부분 $variablename = "test";에서 오류 메시지를 발생시키는 동일한 부분을 ​​두 번 사용했습니다 .
Kai Noack

77

TL; DR

stringa 키가있는 배열 인 것처럼 a에 액세스하려고 합니다 string. string이해하지 못할 것입니다. 코드에서 우리는 문제를 볼 수 있습니다 :

"hello"["hello"];
// PHP Warning:  Illegal string offset 'hello' in php shell code on line 1

"hello"[0];
// No errors.

array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.

깊이

그 오류를 보자.

경고 : 잘못된 문자열 오프셋 'port'...

그것은 무엇을 말하는가? 문자열을 문자열 'port'의 오프셋으로 사용하려고 합니다. 이처럼 :

$a_string = "string";

// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...

// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...

무엇이 원인입니까?

어떤 이유로 당신은을 기대 array했지만 string. 그냥 섞어. 아마도 변수가 변경되었을 수도 있고, 결코 변하지 않았을 수도 있습니다 array. 정말 중요하지 않습니다.

무엇을 할 수 있습니까?

가 있어야한다는 것을 알고 있다면 array기본 디버깅을 수행하여 왜을 갖지 않는지 결정해야합니다 array. 우리가있을 것이다 경우에 우리가 알 수없는 경우 array또는 string상황이 조금 까다된다.

우리가 할 수있는 일은 온갖 종류의 검사를 통해 우리가 is_arrayand 및 isset/ 와 같은 것에 대한 통지, 경고 또는 오류가 없는지 확인합니다 array_key_exists.

$a_string = "string";
$an_array = array('port' => 'the_port');

if (is_array($a_string) && isset($a_string['port'])) {
    // No problem, we'll never get here.
    echo $a_string['port'];
}

if (is_array($an_array) && isset($an_array['port'])) {
    // Ok!
    echo $an_array['port']; // the_port
}

if (is_array($an_array) && isset($an_array['unset_key'])) {
    // No problem again, we won't enter.
    echo $an_array['unset_key'];
}


// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
    // Ok!
    echo $an_array['port']; // the_port
}

isset와 사이에는 약간의 차이가 array_key_exists있습니다. 예를 들어의 값 $array['key']nullisset경우을 반환합니다 false. array_key_exists가 존재 하는지 확인 합니다 .


13

여기에 많은 훌륭한 답변이 있지만 내 문제가 훨씬 더 간단하다는 것을 알았습니다.

다음 명령을 실행하려고했습니다.

$x['name']   = $j['name'];

나는이지고 있었어요 illegal string에 오류를 $x['name']내가 먼저 배열을 정의하지 않았기 때문에. 그래서 물건을 할당하기 전에 다음 코드 줄을 넣었습니다 $x[].

$x = array();

그리고 효과가있었습니다.


1
나는 이것이 대답이어야한다고 생각합니다. 이것은 5.4 (7 이전)와 7 사이의 차이 여야합니다.
sonnb

7

질문에 조금 늦었지만 검색중인 다른 사람들에게 : 잘못된 값 (유형)으로 초기화 하여이 오류가 발생했습니다.

$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset

올바른 방법은 다음과 같습니다.

 $varName = array();
 $varName["x"] = "test"; // works

$ 변수 varName = (배열) $ shouldBeArray : $ 변수 varName는, 예를 들어,이 피할 수있는 가치를 강요, 배열해야하지만, 빈 문자열이 될 수있는 값에서 초기화되는 경우
markdwhite

4

PHP 5.4부터 함수가 기대하는 것과 동일한 데이터 타입 값을 전달해야합니다. 예를 들면 다음과 같습니다.

function testimonial($id); // This function expects $id as an integer

이 함수를 호출 할 때 다음과 같이 문자열 값이 제공되는 경우 :

$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning

데이터 형식이 일치하지 않아 잘못된 오프셋 경고가 생성됩니다. 이를 해결하기 위해 다음을 사용할 수 있습니다 settype.

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly

이것이 배열과 어떻게 관련이 있습니까?
설명이 아닌 사용자

2

배열을 확인하기 전에 다음을 수행하십시오.

if(!is_array($memcachedConfig))
     $memcachedConfig = array();

1

내 경우에는 mysql_fetch_assoc을 mysql_fetch_array로 변경하고 해결하십시오. :-( 그리고 다른 버전의 proyect는 fetch assoc으로 실행됩니다.


1

내 경우에는 다음과 같이 SQL 쿼리 를 수행하는 함수가 변경되면 해결했습니다 return json_encode($array).return $array


1

그것은 나에게 작동합니다 :

내 테스트 코드 :

$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{  
    $test = $result['c'];
}
print_r($test);

산출: 55

확인 해봐 감사


1

그냥 사용

$memcachedConfig = array();

전에

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ....

이는 $ memcachedConfig를 정의하지 않기 때문에 기본적으로 배열이 아닌 문자열로 처리됩니다.


1

trim () 함수를 사용 하여이 문제를 해결했습니다. 문제는 공간과 관련이있었습니다.

그래서 시도하자

$unit_size = []; //please declare the variable type 
$unit_size = exolode("x", $unit_size);
$width  = trim ($unit_size[1] );
$height = trim ($unit_size[2] );

이것이 도움이되기를 바랍니다.


0

누군가를 돕기 위해 직렬화 된 배열을 직렬화 해제하는 것을 잊었 기 때문에이 오류가 발생했습니다. 그것이 귀하의 사건에 적용되는지 확인해야 할 부분입니다.


0

그것은 오래된 것이지만 누군가가 이것으로부터 이익을 얻을 수있는 경우입니다. 배열이 비어 있으면이 오류가 발생합니다.

내 경우에는

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 

내가 바꿨다 :

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
if(is_array($buyers_array)) {
   echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
} else {
   echo 'Buyers id ' . $this_buyer_id . ' not found';
}

0

이 메시지의 유일한 이유는 대상 배열이 실제로 문자열 등의 배열이기 때문이라고 생각합니다 (JSON-> { "host": "127.0.0.1"}) 변수


0

PHP의 경우

//Setup Array like so
$memcachedConfig = array(
  "host" => "127.0.0.1",
  "port" => "11211"
);

//Always a good practice to check if empty

if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){

    //Some codes

    print_r ($memcachedConfig['host']);
    print_r ($memcachedConfig['port']);

}

반환 값이 비어 있지 않은지 확인하십시오. 따라서이 예제는 PHP 용이므로 다른 언어로 배열이 비어 있는지 확인하는 방법을 찾으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.