簡體   English   中英

codeigniter中的動態全局數組

[英]Dynamic global array in codeigniter

我想要一個可以通過控制器功能訪問的全局數組,他們可以使用特定鍵添加或刪除任何項目。 我該怎么做呢? 我已經制作了自定義控制器' globals.php '並將其添加到自動加載庫中。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  $notification_array = array();
  $config['notification'] = $notification_array;
?>

控制器上的以下函數應該將新項添加到我的數組中

function add_data(){
   array_unshift($this->config->item('notification'), "sample-data");
}

在add_data添加到全局數組之后,每當從客戶端調用以下函數時,它應該將更新的數組提供給客戶端。

function send_json()
{
   header('content-type: application/json');
   $target = $this->config->item('notification');
   echo json_encode($target);
}

但我的客戶端總是得到空數組。 我怎樣才能做到這一點? 請幫忙。

嗨利用OOP,像這樣

//將MY_Controller.php放在核心目錄下

class MY_Controller extends CI_Controller{

  public $global_array = array('key1'=>'Value one','key2'=>'Value2'):

   public function __construct() {
        parent::__construct();
    }

}

//頁面控制器

class Page extends MY_Controller{

public function __construct() {
            parent::__construct();
        }

function send_json()
{
   header('content-type: application/json');
   $target = $this->global_array['key1'];
   echo json_encode($target);
}

}

我提出的一個解決方案是使用會話,它易於使用,而且“快速”需要進行一些基准測試。

正如我對上面/下面的兩個答案所評論的那樣,你不可能在不同的控制器中獲得相同的數據,因為每個請求都被“重置”,並且要到達不同的控制器,你至少需要重新加載頁面。 (注意,即使是AJAX調用也會提出新請求)

請注意,會話受大小的限制,您有4kb的限制(CodeIgniter將會話存儲為Cookie)但等待,有辦法將它們存儲在DB中(允許這個轉到配置文件並將其打開到$config['sess_use_database'] = TRUE; +創建表格,你會在這里找到更多)

好吧,讓我們得到答案本身,據我所知你嘗試擴展所有控制器,如果沒有這樣做,並在核心/ MY_Controller.php文件中放置一些代碼,如下所示:

private function _initJSONSession() { //this function should be run in MY_Controller construct() after succesful login, $this->_initJSONSession(); //ignore return values

    $json_session_data = $this->session->userdata('json');

    if (empty($json_session_data )) {

    $json_session_data['json'] = array(); //your default array if no session json exists,
                                          //you can also have an array inside if you like

        $this->session->set_userdata($ses_data);
        return TRUE; //returns TRUE so you know session is created
    }

return FALSE; //returns FALSE so you know session is already created

}

你還需要這幾個函數,它們是自我解釋的,所有這些函數都是公共的,所以你可以在任何由MY_Controller.php擴展的控制器中自由使用它們,就像這樣

$this->_existsSession('json');

public function _existsSession( $session_name ) {

    $ses_data = $this->session->userdata( $session_name );

    if (empty( $ses_data )) return FALSE;

    return TRUE;

}

public function _clearSession($session_name) {

    $this->session->unset_userdata($session_name);

}

public function _loadSession($session_name) {

    return (($this->_existsSession( $session_name )) ? $this->session->userdata($session_name) : FALSE );

}

最有趣的函數是_loadSession() ,這種自我解釋我花了一段時間來完全理解會話本身,好幾句話你需要得到(加載)會話中的數據,用它做一些事情([ CRUD]喜歡添加新數據,或刪除一些),而不是將所有數據放回( REWRITE )同一會話中。


讓我們舉個例子:

請記住,會話就像2d數組(我自己使用4 + 5d數組)

$session['session_name'] = 'value';

$session['json'] = array('id' => '1', 'name' => 'asok', 'some_array' => array('array_in_array' => array()), 'etcetera' => '...');

所以在你使用的會話中寫新( 重寫 )的東西

{
    $session_name = 'json';

    $session_data[$session_name] = $this->_loadSession($session_name);

    //manipulate with array as you wish here, keep in mind that your variable is
    $session_data[$session_name]['id'] = '2'; // also keep in mind all session variables are (string) type even (boolean) TRUE translates to '1'

    //or create new index
    $session_data[$session_name]['new_index'] = FALSE; // this retypes to (string) '0'

   //now put session in place

    $this->session->set_userdata($session_data);

}

如果你想使用自己的函數add_data()你需要這樣做

  1. 你需要先將一些數據傳遞給它add_data($arr = array(), $data = ''){}

例如: array_unshift( $arr, $data );

{
    //your default array that is set to _initJSONSession() is just pure empty array();  

    $session_name = 'json';        
    $session_data[$session_name] = $this->_loadSession( $session_name );

    // to demonstrate I use native PHP function instead of yours add_data()
    array_unshift( $session_data[$session_name], 'sample-data' );

    $this->session->set_userdata( $session_data );
    unset( $session_data );
}

這就對了。

您可以為每個控制器添加“全局”數組。

在控制器的頂部:

public $notification_array = array();

然后在您將使用的不同函數內訪問它:

$this->notification_array;

因此,如果您想向其中添加項目,您可以執行以下操作:

$this->notification_array['notification'] = "Something";
$this->notification_array['another'] = "Something Else";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM