2012-03-26 1 views
1

개체 내의 배열에있는 값을 동적으로 사용하려고합니다.

내 경우에는이 배열이 있습니다.

$this->customer = array(
    [dealerId] => 4 
    [billFirstName] => Joe 
    [billLastName] => Blo 
    [billAddress1] => 1010s  
    [billAddress2] => 1020s 
    [billCity] => Anytown 
    [billState] => ST 
    [billCountry] => USA 
    [billPostalCode] => 11111 
    [dEmail] => emailaddress 
    [billPhone] => 8008008888 
    [password] => password 
    [distPrice] => 5 
    [distCost] => 20); 

$result = $this->keyCheck('dealerId', 'customer'); 

방법 내가 사용 :

protected function keyCheck($key, $array, $type = false) 
    { 
     if(array_key_exists($key, $this->$array) && $this->$array[$key]): 
     return $this->$array[$key]; 
     else: 
     return $type; 
     endif; 
    } 

첫 번째 검사 작업 (array_key_exists ($ 키 $이 -> $ 배열)). 하지만 두 번째 검사는 실패합니다 ($ this -> $ array [$ key]). 배열의 해당 색인에 값이 있더라도. 나는 배열이 keyCheck() 메소드 안에 존재한다는 것을 증명했다. print_r ($ this -> $ array); 메서드 내부. 그리고 내가 찾고있는 값을 사용하여 메서드 내에서 사용할 수있는 알아, $ this -> $ array [ 'dealerId'];

내가 사용하고있는 이름이나 방법론에 매달리지 말고, 내가 정말로 관심을 가지는 것은이 방법으로 동적으로 처리되는 배열의 값을 처리하는 방법을 찾는 것입니다.

그것은 아마이 공개 된 후에는 내 머리를 때리고있을거야 그렇게 쉽게

...

+1

사용하고 무엇을 얻을 볼 수 있습니다. print_r은 Null 값을 신뢰하지 않습니다. – Melsi

+0

isset()을 사용하는 것은 어떻습니까? 뭔가 바뀌어? –

+0

고마워, 나는 그것을 시도하고 배열에 null 값이 없습니다. "$ this -> $ array [ 'dealerId'] print"메서드 내에서 테스트를 수행하면 원하는 값을 얻을 수 있지만 어떤 이유로 변수를 사용하여 인덱스를 지정하면 작동하지 않습니다. – Foaminator

답변

4

당신은 즉, 배열 트랩으로 지칠대로 지친 치료 문자열로 실행됩니다

$str = 'customer'; echo $str[0]; // prints c 

$array[$key] 부분이 $this->$array[$key] 인 경우 은 문자열 $ 배열의 n 번째 인덱스를 표시합니다 (customer을 전달하면 존재하지 않는 $this->c에 액세스하려고 시도합니다). 배열에 변수를 먼저 할당하십시오. 다음은 그 예이다 :

class A 
{ 
    public $customer = array('dealerId'=>4, 'billFirstName'=>'Joe'); 

    public function keyCheck($key, $arrayName, $type = false) 
    { 
     $array = $this->$arrayName; 
     if(array_key_exists($key, $array) && $array[$key]) { 
      return $array[$key]; 
     } else { 
      return $type; 
     } 
    } 
} 

$a = new A(); 
echo $a->keyCheck('billFirstName', 'customer'); // Joe 

또는, 복잡한 구문을 사용할 수 있습니다 $this->{$arrayName}[$key]를 Artjom의 대답에 제안.

PHP 5.4 addresses this gotcha :

[In PHP 5.4] Non-numeric string offsets - e.g. $a['foo'] where $a is a string - now return false on isset() and true on empty(), and produce a E_WARNING if you try to use them.

E_WARNING 개발자가 훨씬 더 신속하게 원인을 추적 할 수 있도록해야한다.

+0

Gah !!!!! 그게 다야! 고맙습니다! – Foaminator

+0

당신을 진심으로 환영합니다. 가능한 한 upvote 및 체크 표시하십시오! 더 많은 정보를 추가하겠습니다. – webbiedave

+0

"유용한 답변"을 제공 하겠지만 아직 충분한 담당자가 없습니다. :) – Foaminator

1

음 u는 당신이에 대한 의심되는 경우 문 내부에 더 나은 위해서 var_dump에게 일부를했다

$this->{$array}[$key]; 
+0

흥미로운 오류가 발생했습니다 ... "잡을 수있는 치명적인 오류 : 고객 클래스의 객체를 159 행의 /home/classes/Basic.class.php에있는 문자열로 변환 할 수 없습니다." – Foaminator

+0

사실, 제대로 작동했기 때문에 PHP는 5.3.9 –

+0

이상한.이 구문은 초기 5.2에서 작동해야합니다. – webbiedave