1

foreachwith aswitchステートメントを使用してループされるデータに基づいて、関数内で一連の変数を宣言する必要がありますforeach。私が使用している変数の範囲を誤解していると思います。どんな助けも素晴らしいでしょう。

class Users {

    public function createUserData(){
        $user = $this->getUserData(); //not shown function
        $this->createFullDataSet($user);
    }

    private function createFullDataSet($user){
        foreach( $user['meta'][0] as $key => $value) {
        //variables required later
        $entity_def_id = 0;
        $entity_id = 0;
        $data_def_id = 0;
        $user_id = 0;
        //thats plenty, you get the idea

        switch( $key ){
           case "id":
               //set $user_id to use later
               $user_id = $value; // <<-- DOESN'T WORK, only works within the case
               break;
           case "email":
           case "username":
           case //lots of other cases...
               break;
           case "location":
           case "hometown":
           case "something":
               //for the last three, the data structure is the same, good test case
               //foreach starts when certain conditions met, irrelevant for question
               foreach( $value as $data_key => $data_value ){
                   $data_type = 'string';
                   if( is_numeric( $data_value )
                       $data_type = 'integer';

                   $data_def_id = $this->createDataDef( some $vars ); //returns an ID using $pdo->lastInsertId(); ( works as has echo'd correctly, at least within this case )

                   $this->createSomethingElse //with variables within this foreach, works
               }
               break;
            } //end of switch
            $this->createRelation( $data_def_id ); // <<-- DOESN'T WORK!! Empty variable
        }
    }

    private function createRelation( $data_def_id ){
        // something awesome happens!
    }
}

上記のコードからわかるように、switch ステートメントの外で変数を使用したいのですが、既存のデータ構造のためにforeach-> switch->で宣言する必要がありますforeach(このデータ構造は面倒であり、これが必要な理由です)。誰かが尋ねる前に、「簡単にするために変更する」ことはできません)。

今、私は foreach および switch ステートメントの変数スコープを調べてきました ( hereherehereおよびhereで、さらに検索しようとしました)$data_def_idが、関数の開始時に が に設定されている理由については賢明では0ありません。 inner に含まれる値にリセットされませんforeachglobalこの機能の一部は製品で使用されるため、変数の使用を避けようとしています。

private functionプライベート関数全体 ( 、 などを含むforeach) で、内の変数を使用できるようにする必要がありますswitch。私は何を間違っていますか、どうすれば修正できますか?

4

2 に答える 2