我正试图在对象内的数组中动态使用值。
在我的特殊情况下,我有一个这样的数组。
$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($key,$this->$array))。但是第二次检查失败($this->$array[$key]),即使数组的索引中有一个值。我已经通过使用print_r($this->$array)证明了数组存在于keyCheck()方法中;方法内部。我知道我正在寻找的值在方法中是可用的,通过使用,print$this->$array['dealerId'];
不要纠结于名称或我正在使用的方法,我真正感兴趣的是找出如何寻址以这种方式动态寻址的数组中的值。
这可能很容易,一旦事情曝光,我就会拍脑袋。。。
您遇到了可怕的将字符串视为数组陷阱,即:
$str = 'customer'; echo $str[0]; // prints c
$this->$array[$key]
的$array[$key]
部分被解释为显示字符串$array的第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
或者,您可以使用复杂的语法:如Artjom的答案中所建议的$this->{$arrayName}[$key]
。
PHP 5.4解决了这个问题:
[在PHP 5.4]非数字字符串偏移量-例如$a['fo'],其中$a是string-现在对isset()返回false,对empty()返回true,并生成如果您尝试使用它们,则显示E_WARNING。
这个E_WARNING
应该可以帮助开发人员更快地找到原因。
你必须使用
$this->{$array}[$key];