$this->$数组[$key]在存在值时不返回任何值


$this->$array[$key] returning nothing when there is a value in place

我正试图在对象内的数组中动态使用值。

在我的特殊情况下,我有一个这样的数组。

$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];