PHP의 함수에서 반환 된 배열에 액세스


88

원하는 위치에 사이트에 코드를 삽입하는 템플릿 엔진을 사용하고 있습니다.

아주 쉬운 것을 테스트하는 함수를 작성했습니다.

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

문제는 $ this-> data가 비공개이고 어디에서나 액세스 할 수 없기 때문에 getData (); 내 문제가 발생합니다.

$this->getData()['a']['b']

작동하지 않으며 값을 먼저 할당해도 if () 블록에서 직접 사용되기 때문에 그렇지 않습니다.

어떤 아이디어?


반환 값을 할당하는 것은 확실히 효과가 있으며 유일한 방법입니다. 작동하지 않는 코드를 보여줄 수 있습니까?
Anti Veeranna

코드가 if (/ * code here * /)에 삽입되기 때문에 작동하지 않습니다. 그래서 이전에 데이터를 할당 할 수는 없습니다.
enyo 09-09-22

1
어쨌든 도대체 무엇을 짓고 있습니까? :) eval에 뭔가?
Anti Veeranna

무엇을 확인하려고합니까? 배열 요소가 존재하고 값이 비어 있지 않은지 확인하려고합니까? 이를 위해 'empty'기능을 사용할 수 있습니다. 이 질문은 더 명확해야합니다!
txwikinger

반환하는 문자열 값은 어떻게 myfunction()처리 되었습니까? 귀하의 질문에 해당 부분이 없습니다.
hakre

답변:


134

PHP 5.4부터 정확히 다음과 같이 할 수 있습니다.

getSomeArray()[2]

참조 : https://secure.php.net/manual/en/language.types.array.php#example-62

PHP 5.3 또는 이전 버전에서는 임시 변수를 사용해야합니다.


4
내가있어 PHP 5.4.11-1~precise+1이 기능이 작동하지 않습니다! 응답 메시지 수신Parse error: syntax error, unexpected '['
Eugene

1
+ 유진이 작동하게 하셨나요? 다른 사람들도 같은 문제를 경험할 수 있습니다.
enyo

2
함수에서 반환 된 배열 표기법을 지원하기 위해 PHP 5.4까지 걸렸습니다?! 끔찍한 버그입니다.
Basil Musa

그런 다음 array_filter에 의해 생성 된 배열의 첫 번째 요소를 가져
와서

17

다음과 같은 것을 사용할 수 없습니다.

$this->getData()['a']['b']

즉, 배열 액세스 구문은 함수 호출에서 직접 가능하지 않습니다.

다음 과 같은 임시 변수 를 사용해야 합니다.

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

귀하의 경우 이것은 아마도 다음과 같은 것을 사용하는 것을 의미합니다.

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

다음을 수행해야합니다.

  • 먼저 getData()메서드를 호출 하고 반환 값을 임시 변수에 저장합니다.
  • 그런 다음 테스트에 해당 임시 변수를 사용하십시오.

선택의 여지가 많지 않습니다. 사실 ...


글쎄요, 제 문제는이 코드가 if (/ * 코드가 여기 * /)에 직접 삽입된다는 것입니다. 그래서 함수를 정의하는 것은 정말 불가능합니다 ...
enyo

메서드 호출의 결과를 if 문 앞에있는 변수에 할당 할 수없고 if 문에서 직접 메서드를 호출하는 대신 if 문에서 해당 변수를 사용할 수 있습니까?
Pascal MARTIN

1
안타깝게도 아니 ... 이것은 템플릿 엔진이고 나는 그것을 제어 할 수 없습니다.
enyo

12

좋아 ... 분명히 더 좋은 방법은 없기 때문에 그렇게 아름답 지 않은 해결책으로 스스로 대답 할 것입니다.

함수를 만들었습니다.

arrayGet($array, $index) { return $array[$index]; }

그리고 다음과 같이 사용했습니다.

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

이것은 예쁘지는 않지만 작동합니다.


1

$this->data입니다 항상 이 보호되는 경우, 접근. 어디에서나 액세스 할 수 없으므로 코드에서 반환 하고 그 자체로 평가되면 괜찮을 것입니다.$object->data$this

Btw, 코드에 버그가 있습니다. 따옴표를 이스케이프해야합니다.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

네 죄송합니다 ... 내 게시물을 수정했습니다 : $ this-> data는 물론 비공개입니다. 또한 버그를 만들 때 내 오타를 수정했습니다.
enyo

1

PHP 버전 5.4부터 가능합니다.

임시 변수원하지 않고 PHP 버전이 5.4 미만인 경우 에도 몇 가지 내장 함수를 사용하여 첫 번째 또는 마지막 요소를 가져올 수 있습니다.

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

편집 : !!! 이후 버전 (5.4+)에서는 end가 매개 변수로만 변수를 예상하기 때문에 PHP가 알림을 표시합니다.

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