PHP超奇怪的警告:创建密钥时的illigal字符串偏移

Ale*_*lex 4 php arrays

我有一个非常奇怪的问题.我正在运行foreach循环来编译数组,但是我收到一个错误.

我发现以下警告:

警告:非法字符串偏移'clientaccount_id'

对于这行代码:

$this->PreparedData[$table][$field] = 0;
Run Code Online (Sandbox Code Playgroud)

如果我做的话,我会说这是逻辑:

$ testVariable = $ this-> PreparedData [$ table] [$ field];

然后填充'clientaccount_id'的变量$字段将不存在.但我正在创建字段'clientaccount_id'所以对我来说这几乎不可能出错.

代码

private function AssignData(){
    foreach($this->FieldKeys as $table => $value){
        ///######## IF THE PREPARED DATA ARRAY DOES NOT EXIST
        if(isset($this->PreparedData[$table]) === false){
            ///######## SET THE ARRAY KEY
            $this->PreparedData[$table] = array();
        }
        ///######## RUN THROUGH ALL SET SUB DATA
        foreach($value as $field){
            ///######## IF THE FIELD EXISTS
            if(isset($this->AccountData[$field]) === true){
                ///######## ASSIGN THE DATA
                ///$this->PreparedData[$table][$field] = $this->AccountData[$field];
                ///$this->PreparedData[$field] = $this->AccountData[$field];
                $this->PreparedData[$table][$field] = 0;
            }
        }
    }
    exit('GOT THROUGH!!');
}
Run Code Online (Sandbox Code Playgroud)

谁能看到我忽略的错误?

解决了!!

感谢VMcreator

改变了:

isset($this->PreparedData[$table]) === false
Run Code Online (Sandbox Code Playgroud)

对此:

is_array($this->PreparedData[$table]) === false
Run Code Online (Sandbox Code Playgroud)

请阅读下面的说明为什么

VMc*_*tor 10

尝试更改此行:

isset($this->PreparedData[$table]) === false
Run Code Online (Sandbox Code Playgroud)

对此:

 !is_array($this->PreparedData[$table])
Run Code Online (Sandbox Code Playgroud)

我在这里看到了这个解释:

它只是归结为PHP的疯狂类型系统.

$ fruits ['response'] ['errormessage']是字符串'banana',所以你试图通过['orange']索引访问该字符串中的字符.

为了索引,字符串'orange'被转换为整数,因此它变为0,如$ fruits ['response'] ['errormessage'] [0].字符串的第0个索引是字符串的第一个字符,因此对于非空字符串,它基本上是设置的.因此isset()返回true.

你可能很好奇为什么你的情况与引用的语句相当,即使$ this-> PreparedData [$ table]只是一个单维数组,而且它不仅仅是一个单维数组,因为你正在访问一个类对象,它只是喜欢这个$ this ["PreparedData"] [$ table].