Как отменить или очистить глобальную переменную в рекурсивной функции php YII2?

#php #mysql #yii2

#php #mysql #yii2

Вопрос:

На моем контроллере

 
   

 class BalanceSheetController extends Controller
{
    public $dataProvider=array(); //Global for The recursuive function
    public function recursive_select_transactions($ledger,$array_){
        
        $Current_ledger = AccountGroup::find()->where(['like','slug',$ledger])->one()->id;
            
        $get_childs = AccountGroup::find()->select('id,slug,parent_id,name')->where(['parent_id'=>$Current_ledger])->asArray()->all();
            
        if (count($get_childs) != 0) {
            
            foreach($get_childs as $childs ) {
                $this->recursive_select_transactions($childs['slug'],$array_);  
            }
        }
            
        $get_head = AccountHead::find()->where(['group_id'=>$Current_ledger])->asArray()->all();
            
        $get_head_altered=array();
        foreach($get_head as $head){
            $acc_slug = str_replace("-", "_", $head['slug']);
            $head['transaction_slug']=$acc_slug ;

            array_push($get_head_altered,$head);
        }
        foreach($get_head_altered as $key=>$val){
            $array_[]=$val['transaction_slug'];
        }
        $this->dataProvider[]=$array_;
    }
}

 

На мой взгляд

 
 

    function array_flatten($array)
    {
        if (!is_array($array)) {
            return FALSE;
        }
        $result = array();
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $result = array_merge($result, array_flatten($value));
            } else {
                $result[$key] = $value;
            }
        }
        return $result;
    }
    $liability = array();
    $liability_details = $this->context->recursive_select_transactions('liability', $liability);
    $liability_details = $this->context->dataProvider;
    $liability_slugs = array_flatten($liability_details);
    
    $asset=array();
    $asset_details = $this->context->recursive_select_transactions('asset', $asset);
    $asset_details = $this->context->dataProvider;
    $asset_slugs = array_flatten($asset_details);
    
    
    echo"<pre>";print_r($liability_slugs);echo"<pre>";
    echo"<pre>";print_r($asset_slugs);echo"<pre>";

 

$dataProvider — это глобальная переменная.И результирующий массив, последний вызванный, имеет элементы первого вызванного.Потому что глобальная переменная сохраняет

 Array
(
    [0] => chitty_settlement
    [1] => cess_collected
    [2] => hallmarking_charges_received
    
)
Array
(
    [0] => chitty_settlement
    [1] => cess_collected
    [2] => hallmarking_charges_received
    [3] => output_cgst_ac
    [4] => output_igst_ac
    [5] => output_sgst_ac
   
)
 

Этот первый элемент массива (libility) остается при вызове с другим параметром (asset).
Как очистить элементы глобальной переменной перед ее повторным вызовом с другим параметром
Я попробовал это

  $liability = array();
    $liability_details = $this->context->recursive_select_transactions('liability', $liability);
    $liability_details = $this->context->dataProvider;
    $liability_slugs = array_flatten($liability_details);

    unset($this->context->dataProvider);

    $asset=array();
    $asset_details = $this->context->recursive_select_transactions('asset', $asset);
    $asset_details = $this->context->dataProvider;
    $asset_slugs = array_flatten($asset_details);

 

это не работает.

Комментарии:

1. Я не вижу никакой глобальной переменной, попробуйте лучше объяснить, какая глобальная переменная, и обновите свой вопрос, а также добавьте образец данных, а не только результат..

Ответ №1:

$this-> context->dataProvider=array();